Métodos Get y Set de las propiedades de clase

Custom properties with Get and Set

Como hemos visto (Introducción a las clases en Kotlin), en Kotlin las clases tienen propiedades que pueden ser declaradas como mutables o de solo lectura, y nos referimos a ellas simplemente con su nombre precedido de un punto de esta manera:

// Clase Usuario con un constructor primario que acepta tres parámetros
class Usuario(id: Int, nombre: String, edad: Int) {

    // propiedades de la clase Usuario
    val id: Int = id            // immutable (solo lectura)
    var nombre: String = nombre // mutable
    var edad: Int = edad        // mutable
}

fun main(args: Array<String>) {

    val usuario = Usuario(1, "Juan Palomo", 34)
    val nombre = usuario.nombre // obtiene el valor de esta propiedad
    usuario.edad = 46 // establece el valor de esta propiedad
    usuario.id = 2  // Error: la propiedad no puede ser reasignada
}

En la programación orientada a objetos es habitual el uso de los métodos get() y set() para obtener y establecer, respectivamente, el valor de una propiedad, pero en Kotlin estos métodos son opcionales para el programador ya que se generan automáticamente.

Concretamente, Kotlin genera internamente los métodos get y set para las propiedades mutables y get para las propiedades de solo lectura, y se encarga de invocarlos cada vez que accedemos o modificamos el valor de una propiedad. Por ejemplo, la clase Usuario del código anterior es funcionalmente equivalente y se vería así utilizando estos métodos de manera explícita (métodos que se escriben sin la palabra reservada fun):
class Usuario(id: Int, nombre: String, edad: Int) {

    val id: Int = id
        get() = field

    var nombre: String = nombre

        // método get
        // field almacena el valor de la propiedad
        get() = field

        // método set
        // el parámetro no especifica su tipo porque es del mismo tipo que la propiedad nombre
        // el parámetro contiene el valor asignado a la propiedad
        set(valor) {
            field = valor
        }

    var edad: Int = edad
        get() = field
        set(valor) {
            field = valor
        }
}

Conociendo los métodos get y set creados por defecto para las propiedades de clase, podemos definirlos y personalizarlos según nuestros intereses. Por ejemplo:
class Usuario(id: Int, nombre: String, edad: Int) {

    val id: Int = id

    var nombre: String = nombre
        get() { // método Get personalizado que devuelve el valor de la propiedad en mayúsculas
            return field.toUpperCase()
        }

    var edad: Int = edad
        set(valor) { // método Set personalizado
            field = if(valor >= 18) valor else throw IllegalArgumentException("Solo mayores de edad")
        }
}

fun main(args: Array<String>) {

    val usuario = Usuario(1, "Juan Palomo", 34)
    println("${usuario.nombre}") // JUAN PALOMO
    usuario.edad = 16            // Lanza IllegalArgumentException
}

Comentarios

Entradas populares

I/O: entrada y salida de datos en consola

Recursos gratis para aprender Kotlin

Lectura y escritura de archivos