Declaración De Objetos En Kotlin

En este tutorial verás la declaración de objetos en Kotlin con el fin de representar el patrón singleton para una clase.

Patrón Singleton En Kotlin

Cuando usas la palabra reservada object en vez de class para declarar una clase, al mismo tiempo se crea una instancia de la misma y se limita la creación de nuevos ejemplares.

Cuando haces esto estas realizando una declaración de objeto u object declaration.

object Elemento{
    /* propiedades, métodos, bloques de inicialización, ...
}

A este comportamiento se le conoce como el patrón Singleton. Donde por cuestiones de diseño, solo necesitaras una única instancia de una clase.

Una declaración de objeto no puede tener constructores, ya que la clase y el objeto son instanciados internamente en el lugar donde se definen.

Ejemplo: Declaración De Objeto

Supongamos que tenemos una clase para los ítems que una organización puede incluir en la creación de sus facturas:

import java.util.*


data class Item(
    val name: String,
    val rate: Float,
    val id: String = UUID.randomUUID().toString()
)

Ahora deseamos crear un repositorio que posibilite el acceso hacia una fuente de datos en memoria de los ítems disponibles.

Ya que este componente representa el único y real origen de datos, es necesario asegurar que exista una sola instancia del mismo. Así que usamos la keyword object en su definición:

object ItemsRepository {
    private val data: LinkedHashMap<String, Item> = linkedMapOf()

    fun add(newItem: Item) {
        data[newItem.id] = newItem
    }

    fun remove(itemId: String) = data.remove(itemId)

    fun getAll() = data.values.toList()
}

Acceder A Una Declaración De Objeto

Al igual que haces con las instancias de las clases, puedes referirte al nombre del objeto como instancia y acceder a las propiedades de la forma NombreObjeto.propiedad.

Por ejemplo, añade cuatro ítems al repositorio e imprime los nombres de los ítems en lista actual.

fun main() {
    ItemsRepository.add(Item("Desarrollo De Apps", 80f))
    ItemsRepository.add(Item("Desarollo Web", 65f))
    ItemsRepository.add(Item("Hosting", 100f))
    ItemsRepository.add(Item("Asesorías", 15f))

    println(ItemsRepository.getAll().map { it.name })
}

Salida:

[Desarrollo De Apps, Desarollo Web, Hosting, Asesorías]

Para añadir ítems usamos el acceso ItemsRepository.add() y para obtener todos los ítems ItemsRepository.getAll().

Finalmente imprimimos un mapeo de la lista con la función map(), la cual recibe un lambda que produce una lista de solo los nombres.

¿Ha sido útil esta publicación?