2017-10-20 13 views
6

En Java, il est possible de cacher un principal constructeur de classe en le rendant private puis d'y accéder via une méthode publicstatic dans cette classe:constructeur privé dans 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; 
    } 

    // ... 
} 

Comment la même chose peut être atteint avec Kotlin sans séparer la classe en une interface public et une implémentation private? Faire un constructeur private le conduit à ne pas être accessible depuis l'extérieur de la classe, même pas depuis le même fichier.

Répondre

5

Ceci est possible à l'aide d'un objet compagnon:

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

      return Foo(someData) 
     } 
    } 

    // ... 
} 

Méthodes dans l'objet compagnon peut être atteint comme si elles étaient des membres de la classe environnante (par exemple Foo.constructorA())

4

Vous pouvez même faire quelque chose plus similaire à "émuler" l'utilisation du constructeur public tout en ayant un constructeur privé.

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