web-dev-qa-db-fra.com

Constructeur privé à Kotlin

Dans Java), il est possible de masquer le constructeur principal d'une classe en le rendant private, puis en y accédant via une méthode publicstatic à l'intérieur de celle-ci. 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 peut-on atteindre le même objectif avec Kotlin sans séparer la classe dans une implémentation public et une implémentation private? Faire 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.

28
Marvin Meller

Vous pouvez même faire quelque chose de plus similaire à "émuler" l'utilisation d'un 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
45
rafal

Ceci est possible en utilisant 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 peuvent être atteintes comme si elles appartenaient à la classe environnante (par exemple, Foo.constructorA()).

12
Marvin Meller