2017-10-20 2 views
6

In Java ist es möglich, eine Klasse Haupt-Konstruktor, indem sie es private machen und dann verstecken sie über eine publicstatic Methode in dieser Klasse den Zugriff auf:privaten Konstruktor in 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; 
    } 

    // ... 
} 

Wie kann das gleiche mit Kotlin erreichbar ohne die Klasse in eine public Schnittstelle und eine private Implementierung zu trennen? Ein Konstruktor private zu machen führt dazu, dass von außerhalb der Klasse nicht zugegriffen werden kann, nicht einmal von der gleichen Datei.

Antwort

5

Dies ist möglich, ein Begleiter-Objekt:

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

      return Foo(someData) 
     } 
    } 

    // ... 
} 

Methoden innerhalb des Begleitobjekt kann wie erreicht werden, wenn sie Mitglieder der umgebenden Klasse waren (zB Foo.constructorA())

4

Sie noch etwas tun kann Ähnelt der "Emulation" der Verwendung des öffentlichen Konstruktors bei einem privaten 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 
Verwandte Themen