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 public
static
à 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.
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
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()
).