Métodos Get y Set de las propiedades de clase
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
Publicar un comentario