una reservadas palabras objetos objeto instanciar herencia funciones clases clase kotlin kotlin-companion

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.