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.