objetos objeto example declarar crear companion clases object kotlin companion-object

object - example - objetos en kotlin



Kotlin: diferencia entre objeto y objeto acompaƱante en una clase (5)

¿Cuál es la diferencia entre un objeto y un objeto compañero en una clase en kotlin?

Ejemplo:

class MyClass { object Holder { //something } companion object { //something } }

Ya leí que se utilizará el objeto complementario, si los parámetros / métodos que lo contienen están estrechamente relacionados con su clase.

Pero, ¿por qué existe también la posibilidad de declarar un objeto normal en la clase? Porque se comporta exactamente como el compañero, pero debe tener un nombre.

¿Hay alguna diferencia en su ciclo de vida "estático" (soy del lado de Java)?


El objeto complementario existe porque puede llamar a las funciones / propiedades de los objetos complementarios como si fuera un método / campo estático de Java. Y por qué su Holder está permitido, bueno, no hay razón para que declarar un objeto anidado sea ilegal. Puede ser útil a veces.


Hay dos tipos diferentes de usos de object , expresión y declaración .

Expresión de objeto

Se puede usar una expresión de objeto cuando una clase necesita una ligera modificación, pero no es necesario crearle una subclase completamente nueva. Las clases internas anónimas son un buen ejemplo de esto.

button.setOnClickListener(object: View.OnClickListener() { override fun onClick(view: View) { // click event } })

Una cosa a tener en cuenta es que las clases internas anónimas pueden acceder a las variables desde el ámbito de inclusión, y estas variables no tienen que ser final . Esto significa que una variable utilizada dentro de una clase interna anónima que no se considera final puede cambiar el valor inesperadamente antes de acceder a ella.

Declaración de objeto

Una declaración de objeto es similar a una declaración de variable y, por lo tanto, no se puede usar en el lado derecho de una declaración de asignación. Las declaraciones de objetos son muy útiles para implementar el patrón Singleton.

object MySingletonObject { fun getInstance(): MySingletonObject { // return single instance of object } }

Y el método getInstance se puede invocar así.

MySingletonObject.getInstance()

Objeto acompañante

Un objeto complementario es un tipo específico de declaración de objeto que permite que un objeto actúe de manera similar a los objetos estáticos en otros lenguajes (como Java). Agregar companion a la declaración del objeto permite agregar la funcionalidad "estática" a un objeto a pesar de que el concepto estático real no existe en Kotlin. Aquí hay un ejemplo de una clase con métodos de instancia y métodos complementarios.

class MyClass { companion object MyCompanionObject { fun actsAsStatic() { // do stuff } } fun instanceMethod() { // do stuff } }

Invocar el método de instancia se vería así.

var myClass = MyClass() myClass.instanceMethod()

Invocar el método de objeto complementario se vería así.

MyClass.actsAsStatic()

Vea los documentos de Kotlin para más información.


Los objetos pueden implementar interfaces. Dentro de una clase, definir un objeto simple que no implemente ninguna interfaz no tiene ningún beneficio en la mayoría de los casos. Sin embargo, definir varios objetos que implementan varias interfaces (por ejemplo, Comparator ) puede ser muy útil.

En términos de ciclo de vida, no hay diferencia entre un objeto complementario y un objeto con nombre declarado en una clase.


Un objeto Companion se inicializa cuando se carga la clase (normalmente la primera vez que otro código que se está ejecutando hace referencia a ella), mientras que las declaraciones de Objeto se inicializan perezosamente cuando se accede por primera vez.

Consulte https://kotlinlang.org/docs/reference/object-declarations.html la sección inferior define claramente la diferencia entre estos dos.


Un objeto, o una declaración de objeto, se inicializa perezosamente cuando se accede por primera vez.

Un objeto complementario se inicializa cuando se carga la clase correspondiente. Produce la esencia ''estática'', aunque Kotlin no admite inherentemente miembros estáticos.