2017-10-20 110 views
6

在Java中有可能通過使private,然後通過publicstatic方法訪問它,這個類裏面隱藏類的主要構造:私有構造在科特林

public final class Foo { 
    /* Public static method */ 
    public static final Foo constructorA() { 
     // do stuff 

     return new Foo(someData); 
    } 

    private final Data someData; 

    /* Main constructor */ 
    private Foo(final Data someData) { 
     Objects.requireNonNull(someData); 

     this.someData = someData; 
    } 

    // ... 
} 

如何同與科特林達到沒有將類分成public接口和private實現?構造函數private導致它無法從課程外部訪問,甚至不能從同一個文件訪問。

回答

5

這是可能使用的配套對象:

同伴對象內部
class Foo private constructor(val someData: Data) { 
    companion object { 
     fun constructorA(): Foo { 
      // do stuff 

      return Foo(someData) 
     } 
    } 

    // ... 
} 

的方法可以達到一樣,如果他們周圍的類的成員(例如Foo.constructorA()

4

你甚至可以做一些事更類似於在具有私有構造函數的情況下「模擬」公共構造函數的使用。

class Foo private constructor(val someData: Data) { 
    companion object { 
     operator fun invoke(): Foo { 
      // do stuff 

      return Foo(someData) 
     } 
    } 
} 

//usage 
Foo() //even though it looks like constructor, it is a function call