reservadas - ¿Cuál es el punto de nombrar un objeto compañero en kotlin?
objetos en kotlin (3)
La documentación para objetos complementarios tiene el siguiente ejemplo.
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
Aquí Factory
es el nombre del objeto compañero. Luego continúa diciendo:
El nombre del objeto compañero se puede omitir, en cuyo caso se usará el nombre
Companion
:
Sin embargo, no hay ningún ejemplo que pueda ver que use el nombre del objeto complementario.
Dado que solo puede tener un objeto complementario por clase (de lo contrario, Only one companion object is allowed per class
error de Only one companion object is allowed per class
) el nombre me parece un poco de azúcar sintáctica bastante inútil.
¿Para qué se puede usar realmente el nombre del objeto compañero? ¿Por qué uno se molestaría en usar cualquier nombre para ello?
Sin embargo, no hay ningún ejemplo que pueda ver que use el nombre del objeto complementario.
class Person(val name: String) { companion object Loader {
fun fromJSON(jsonText: String): Person = ... }
}
>>> person = Person.Loader.fromJSON("{name: ''Dmitry''}") >>> person.name
Dmitry
>>> person2 = Person.fromJSON("{name: ''Brent''}") >>> person2.name
Brent
Puedes usar el nombre del acompañante como:
MyClass.create() // not via companion name
MyClass.Companion.create() // via default companion name
MyClass.Factory.create() // via companion name
Quizás el nombre no sea tan importante para Kotlin, ya que solo puede acceder al método sin saber que hay un objeto complementario (línea uno arriba). Es más como un estilo personal, si desea que el acceso a tales funciones sea más explícito.
Pero para la interoperabilidad de Java hace una diferencia, porque tiene que acceder a la función a través del nombre complementario:
MyClass.Factory.create(); // with named companion
MyClass.Companion.create(); // with unnamed comanion
Si no usa un nombre explícito, el nombre de los acompañantes es Companion
, por lo tanto, se puede omitir, como ya ha citado.
A veces es posible que desee tener un nombre explícito en sus llamadas, que sería MyClass.Factory.create()
en su ejemplo. Por razones de espacio de nombres tal vez.
Tampoco veo muchas razones para nombrar un objeto compañero . Excepto si te importa la interoperabilidad de Java con tu código Kotlin. Luego, debe escribir explícitamente el nombre de los compañeros.
Otra razón por la que podría interesarle el nombre es cuando define una función de extensión en él:
fun MyClass.Companion.ext() = "myext"
En este caso, puede ser más claro cuando tiene un nombre como Factory
, en el que se agregan métodos de fábrica específicos a través de la extensión.