Alerta Coder #5 – Propiedades mutables y públicas
No todo tiene que ser privado.
No todo tiene que ser val.
No todo lo que reluce es Kotlin.
En Kotlin por defecto las propiedades públicas ya tienen un getter y un setter propios según si son val
o var
.
var
: tienen un setter y un getter implícitos, por eso podemos hacer esto:
1234class Persona(var nombre)val persona: Persona("Pedro")persona.nombre = "Luis" // Setterprintln(persona.nombre) // Getterval
: solo tienen un getter, ya que es inmutable:
12println(persona.nombre) // Getterpersona.nombre = "Mariano" // Setter. Esta línea no compilaría
Pero para que funcionen el getter y el setter, la propiedad debe ser pública. Verdaderamente, al ser traducida a Java se traduce como privada con setter y getter. Por eso, no debe extrañarnos ver que una clase tiene propiedades públicas y mutables:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class BotonPersonalizado(): FrameLayout(/* Omitido */) { // Quien use este botón debe poder asignarle un onClick. Si fuera privada, o val, nadie podría asignarle clic. var onClickListener: OnClickListener? = null // Quien lo use debe poder cambiar el texto del botón. El texto lo tendrá el TextView de nuestra vista personalizada. var text: String get() = textViewPropio.text set(value) { textViewPropio.text = value } // Si tenemos diferentes tipos de botón, tendremos uno por defecto, pero debemos poder cambiarlo var type: ButtonType = ButtonType.RoundCorners set(value) { field = value when(value) { /* Hacer el cambio según el tipo recibido */ } } // Quien lo use debe poder habilitarlo o inhabilitarlo, y por defecto estará habilitado var isEnabled = true set(value) { field = value if (value) { habilitar() } else { inhabilitar() } } } |
Por desgracia, no siempre podemos ser inmutables. Android necesita estado, en su justa medida, pero lo necesita.