28 votes

Constructeur privé en Kotlin

En Java, il est possible de cacher le constructeur principal d'une classe en le rendant private puis d'y accéder via un public static dans cette classe :

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 obtenir la même chose avec Kotlin sans séparer la classe en un fichier public et une interface private l'implémentation ? Création d'un constructeur private conduit à ce qu'il ne soit pas accessible de l'extérieur de la classe, pas même du même fichier.

45voto

rafal Points 1202

Vous pouvez même faire quelque chose de 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

12voto

Marvin Meller Points 372

Cela est possible grâce à un objet compagnon :

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

            return Foo(someData)
        }
    }

    // ...
}

Les méthodes à l'intérieur de l'objet compagnon sont accessibles comme si elles étaient des membres de la classe environnante (par ex. Foo.constructorA() )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X