java - new - kotlin primary constructor call expected
Constructor privado en Kotlin (2)
Esto es posible usando un objeto compañero:
class Foo private constructor(val someData: Data) {
companion object {
fun constructorA(): Foo {
// do stuff
return Foo(someData)
}
}
// ...
}
Los métodos dentro del objeto compañero pueden alcanzarse como si fueran miembros de la clase circundante (por ejemplo, Foo.constructorA()
)
En Java es posible ocultar el constructor principal de una clase haciéndolo private
y luego accediendo a él a través de un método static
public
dentro de esa clase:
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;
}
// ...
}
¿Cómo se puede alcanzar lo mismo con Kotlin sin separar la clase en una interfaz public
y una implementación private
? Hacer que un constructor sea private
lleva a que no sea accesible desde fuera de la clase, ni siquiera desde el mismo archivo.
Incluso puedes hacer algo más similar a "emular" el uso del constructor público mientras tienes un constructor privado.
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