2017-10-20 59 views
6

w Javie to możliwe, aby ukryć klasy główny konstruktor, czyniąc go private i dostępu do niego za pośrednictwem publicstatic metody wewnątrz tej klasy:prywatny konstruktor w Kotlin

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; 
    } 

    // ... 
} 

W jaki sposób można to samo osiągnąć z Kotlin bez oddzielania klasy w interfejsie public i implementacji private? Tworzenie konstruktora private prowadzi do tego, że nie jest dostępny z zewnątrz klasy, nawet z tego samego pliku.

Odpowiedz

5

Jest to możliwe za pomocą obiektu towarzysz:

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

      return Foo(someData) 
     } 
    } 

    // ... 
} 

Metody wewnątrz obiektu towarzyszącego można dojechać tak jak gdyby byli członkami otaczającej klasy (np Foo.constructorA())

4

Można nawet zrobić coś bardziej podobne do "emulacji" użycia publicznego konstruktora, mając prywatny konstruktor.

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