Contenido del curso

Getters y setters en Kotlin

Resumen

Los getters y setters en Kotlin son métodos que controlan cómo lees y modificas las propiedades de una clase. Si trabajas con clases en Kotlin, dominarlos te permite validar datos, formatear valores y escribir lógica más elegante sin escribir código repetitivo.

¿Qué son los getters y setters y para qué sirven?

En programación orientada a objetos, un getter es un método que retorna el valor de una propiedad, mientras que un setter recibe un valor y modifica el estado de esa variable. Sirven para encapsular lógica: validar entradas, transformar datos antes de guardarlos o calcular un valor a partir de otros.

En la clase [00:30] se muestra el caso clásico: una variable leido de tipo boolean que se obtiene con un get y se modifica con un set. Cuando el parámetro y la variable interna comparten nombre, el compilador se confunde y necesitas la palabra clave this para referirte a la propiedad de la instancia.

¿Cuál es la diferencia entre getter y setter? El getter solo lee y retorna el valor de una propiedad. El setter recibe un nuevo valor y lo asigna, normalmente con alguna validación previa.

¿Cómo se declara un setter personalizado en Kotlin?

Kotlin propone una sintaxis más elegante que la de otros lenguajes. Junto a la variable, declaras directamente el bloque set(value) y usas la palabra clave field para referirte al valor real almacenado.

En el ejemplo de la clase email [02:40], la propiedad asunto valida que el texto recibido no esté vacío:

kotlin class Email(val remitente: String, val mensaje: String) { var asunto: String = "" set(value) { field = if (value.trim().isNotEmpty()) value.trim() else "sin asunto" } }

La lógica es directa: si el valor sin espacios no está vacío, lo asigna limpio. Si está vacío, deja un mensaje por defecto. Aquí aparece una regla importante de Kotlin sobre asignaciones.

¿Por qué un if necesita else en una asignación?

Cuando usas if para asignar un valor, siempre debe existir un else porque la expresión tiene que devolver algo. Si el if solo ejecuta una acción (sin asignar), el else es opcional. Esta diferencia entre if-statement e if-expression es clave en Kotlin.

¿Cómo funciona un getter como propiedad calculada?

Una propiedad calculada es aquella cuyo valor depende de otra propiedad y se computa cada vez que la lees. Se declara con val (inmutable) y un getter inline.

kotlin val esImportante: Boolean get() = asunto.contains("urgente", ignoreCase = true)

En la clase [05:50] se muestra cómo esImportante no almacena nada por sí misma: cada vez que la consultas, evalúa si el asunto contiene la palabra urgente sin importar mayúsculas o minúsculas. Es una forma limpia de formatear valores con base en otros.

¿Qué es una inline function en un getter? Es un getter escrito en una sola línea con get() = expresión. Se usa cuando la lógica cabe en una expresión y no necesitas un bloque completo.

¿Cómo se prueban getters y setters en la práctica?

Al instanciar la clase y asignar valores, el setter se ejecuta automáticamente:

kotlin fun main() { val email1 = Email("juan@gmail.com", "Este es un mensaje") println("El asunto es: ${email1.asunto}") // sin asunto

email1.asunto = "urgente reunión jueves" println("¿El correo es importante? ${email1.esImportante}") // true

}

La primera lectura imprime sin asunto porque la propiedad arrancó vacía y el setter aplicó el valor por defecto. Cuando reasignas con la palabra urgente, la propiedad calculada esImportante retorna true.

Reto: clase Contacto con validación de email

Para afianzar el concepto, en el ejercicio [09:30] se propone crear una clase Contacto con dos requisitos:

  • Un setter en la propiedad email que valide si el texto contiene @. Si lo contiene, asigna el valor; si no, deja el campo vacío.
  • Una propiedad calculada esValido que use un getter para verificar si el email contiene @ y .com.

kotlin class Contacto(val nombre: String) { var email: String = "" set(value) { field = if (value.contains("@")) value else "" }

val esValido: Boolean get() = email.contains("@") && email.contains(".com")

}

Si asignas juan@email.com, el setter guarda el valor y esValido devuelve true. Si quitas el arroba, el setter deja el campo vacío y esValido pasa a false. Así separas la lógica de validación del lugar donde usas el objeto.

¿Qué otras validaciones agregarías a tu setter de email? Cuéntame en los comentarios cómo resolviste el reto.