Propiedades En Kotlin

En este tutorial te mostraremos la declaración de propiedades en Kotlin, el uso de métodos get-set y visibilidad.

Declaración De Propiedades En Kotlin

Una propiedad en Kotlin que pertenece a una clase, es la agrupación de las declaraciones de: un campo, su accesor get y su mutador set.

Al igual que las variables, si usas val, declaras una propiedad de solo lectura y si usas var será mutable.

Por ejemplo, en la siguiente clase para clientes verás cuatro propiedades: ID de cliente, nombre, teléfono y número de órdenes realizadas.

class Customer {
    val customerId: String = "C-100"
    val name: String = "Guillermo Fenix"
    val phone: String = "388-4881"
    var orders: Int = 15
}

Para obtener el valor de una propiedad no llamas un método get(), si no que usas el nombre directamente con la notación de punto.

fun main() {
    // Acceder a una propiedad
    val customer = Customer()
    println(customer.name)

}

Modificar el valor de una propiedad mutable es igual que con una variable. Puedes usar el operador de asignación:

customer.orders = 20

Hasta aquí viste la sintaxis simple de declaración de las propiedades en Kotlin. A continuación verás cómo expandirla para personalizar los getters y setters.

Getters Y Setters

Cuando declaras una propiedad con val, internamente solo se crea el accesor get. Para var se generan ambos:

val = campo + get
var = campo + get + set

Pero si quisieras cambiar el comportamiento por defecto de estos métodos puedes usar las llamadas a set() y get() junto a la propiedad.

Getter Personalizado

Si deseas tener una propiedad que no guarde un valor en un campo, si no que retorne de otro tipo de expresión personalizada, entonces define un getter personalizado con get().

Por ejemplo:

Crear una propiedad con un accesor personalizado para determinar si un animal tiene más de 1 año de vida.

class Animal(
    val name: String,
    var age: Int
) {
    val isOlderThanOne: Boolean
        get() {
            return this.age > 1
        }
}

La solución consiste en agregar a la sintaxis el método get() y definir cuál será el retorno cada vez que accedamos a dicho campo. Es decir, el resultado booleano de la desigualdad entre la edad del animal y 1.

Con ello puedes crear una instancia de Animal y llamas a isOlderThanOne regularmente:

fun main() {

    // Getter personalizado
    val animal = Animal("Chimpi", 2)
    print(animal.isOlderThanOne)
}

En la salida se imprimirá el valor computado de true.

Ahora, como get() tiene una sola expresión de retorno, podemos escribirlo con la sintaxis de funciones con cuerpo de expresión.

val isOlderThanOne: Boolean
    get() = this.age > 1

Otra mejora podría ser la omisión del tipo de isOlderThanOne, recuerda que el compilador de Kotlin es capaz de inferir tipos si el contexto lo deja claro:

val isOlderThanOne
    get() = this.age > 1

Setter Personalizado

Personaliza el método mutador de una propiedad escribiendo el contenido de set().

Si lo requieres usa el identificador field para referirte al valor del campo de la propiedad.

Por ejemplo:

Añadir a la clase Animal le una propiedad para su peso (weight) y otra para determinar si está en sobrepeso (overWeight).

Personalizar el método set() del peso con el fin de evaluar si el valor está por encima de 100 y determinar que está en sobrepeso.

class Animal(
    val name: String,
    var age: Int
) {
    val isOlderThanOne
        get() = this.age > 1

    var overWeight = false

    var weight = 0.0
        set(value) {
            field = value
            overWeight = value > 100
        }
}

La solución asigna a field el valor nuevo que viene del parámetro value (puedes usar otro nombre si deseas). Y en la segunda sentencia asigna a overWeight el resultado booleano de la expresión value > 100.

Prueba la evaluación de la expresión creando un nuevo animal llamado Simone con 12 años. Luego asigna su peso e imprime si está pasada de kilos o no.

fun main() {
    val simone = Animal("Simone", 12)
    // Pesando a Simone...
    simone.weight = 156.32
    // ¿Simone está en sobrepeso?
    print("¿Sobrepeso?:${if (simone.overWeight) "SI" else "NO"}")

}

El resultado en consola será:

¿Sobrepeso?:SI

Accesores Por Defecto

En esencia, declarar una propiedad genera sus accesores con el identificador field internamente.

Es decir, tener la declaración:

class Animal{

    var weight = 0
}

Equivale a definir:

class Animal{

    var weight = 0
        get() = field
        set(value) {
            field = value
        }
}

El compilador nos ahorrará tiempo a la hora de la definición de propiedades en Kotlin.

Visibilidad De Propiedades

Puedes cambiar la visibilidad de los getter y setter, ubicando modificadores de visibilidad.

Por ejemplo.

Hacer privada la asignación de la propiedad overWeight en Animal.

var overWeight = false
    private set

La solución consiste en usar el modificador private junto a set. Podemos evitar el cuerpo de set, ya que no deseamos cambiar la implementación por defecto.

¿Qué Sigue?

En este tutorial aprendiste sobre el uso de propiedades miembro en Kotlin. Viste como declararlas y personalizar tanto getters como setters. Ahora puedes avanzar hacia el estudio de los modificadores de visibilidad.

Únete Al Discord De Develou

Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!