En este artículo, aprenderá sobre declaraciones de objetos (singletons) y expresiones de objetos con la ayuda de ejemplos.
Declaraciones de objeto
Singleton es un patrón orientado a objetos donde una clase solo puede tener una instancia (objeto).
Por ejemplo, está trabajando en una aplicación que tiene un backend de base de datos SQL. Quiere crear un grupo de conexiones para acceder a la base de datos mientras reutiliza la misma conexión para todos los clientes. Para esto, puede crear la conexión a través de la clase singleton para que todos los clientes obtengan la misma conexión.
Kotlin proporciona una forma sencilla de crear singleton utilizando la función de declaración de objetos. Para eso, se utiliza la palabra clave de objeto.
objeto SingletonExample (… // cuerpo de la clase…)
El código anterior combina una declaración de clase y una declaración de una sola instancia SingletonExample de la clase.
Una declaración de objeto puede contener propiedades, métodos, etc. Sin embargo, no se les permite tener constructores (lo cual tiene sentido). ¿Por qué?
De manera similar a los objetos de una clase normal, puede llamar a métodos y acceder a propiedades utilizando la .
notación.
Ejemplo: declaración de objeto
object Test ( private var a: Int = 0 var b: Int = 1 fun makeMe12(): Int ( a = 12 return a ) ) fun main(args: Array) ( val result: Int result = Test.makeMe12() println("b = $(Test.b)") println("result = $result") )
Cuando ejecute el programa, la salida será:
b = 1 resultado = 12
La declaración de objetos puede heredar de clases e interfaces de forma similar a las clases normales.
Singletons e inyección de dependencia
Las declaraciones de objetos pueden resultar útiles a veces. Sin embargo, no son ideales en grandes sistemas de software que interactúan con muchas otras partes del sistema.
Lectura recomendada: Inyección de dependencia y patrón de diseño singleton
Expresiones de objetos de Kotlin
La palabra clave de objeto también se puede utilizar para crear objetos de una clase anónima conocida como objetos anónimos. Se utilizan si necesita crear un objeto de una ligera modificación de alguna clase o interfaz sin declarar una subclase para ello. Por ejemplo ,
window.addMouseListener (object: MouseAdapter () (anular fun mouseClicked (e: MouseEvent) (//…) anular fun mouseEntered (e: MouseEvent) (//…)))
(El ejemplo está tomado de la página oficial de documentos de Kotlin).
Aquí, un objeto anónimo se declara extendiendo la clase MouseAdapter. El programa anula dos MouseAdapter
métodos: mouseClicked()
y mouseEntered()
.
Si es necesario, puede asignar un nombre al objeto anónimo y almacenarlo en una variable. Por ejemplo,
val obj = object: MouseAdapter () (anular fun mouseClicked (e: MouseEvent) (//…) anular fun mouseEntered (e: MouseEvent) (//…))
Ejemplo: expresión de objeto de Kotlin
open class Person() ( fun eat() = println("Eating food.") fun talk() = println("Talking with people.") open fun pray() = println("Praying god.") ) fun main(args: Array) ( val atheist = object : Person() ( override fun pray() = println("I don't pray. I am an atheist.") ) atheist.eat() atheist.talk() atheist.pray() )
Cuando ejecute el programa, la salida será:
Comiendo comida. Hablar con la gente. Yo no rezo. Soy ateo.
Aquí, el objeto anónimo se almacena en la variable atea que implementa la clase Person con el pray()
método anulado.
Si está implementando una clase que tiene un constructor para declarar un objeto anónimo, debe pasar los parámetros de constructor apropiados. Por ejemplo,
open class Person(name: String, age: Int) ( init ( println("name: $name, age: $age") ) fun eat() = println("Eating food.") fun talk() = println("Talking with people.") open fun pray() = println("Praying god.") ) fun main(args: Array) ( val atheist = object : Person("Jack", 29) ( override fun pray() = println("I don't pray. I am an atheist.") ) atheist.eat() atheist.talk() atheist.pray() )
Cuando ejecute el programa, la salida será:
Nombre: Jack, edad: 29 Comiendo. Hablar con la gente. Yo no rezo. Soy ateo.