Las propiedades de extensión son extensiones para clases que permiten agregar getters y setters sin la posibilidad de agregar estado (backing field). En Java, esta opción no existe, y el equivalente es escribir métodos utilitarios. Históricamente, se necesitaba usar métodos estáticos o objetos envolventes para añadir funcionalidad.
Problema: a menudo, en clases de terceros faltan las propiedades necesarias. Se desea ampliar la clase de manera concisa y segura, sin romper la encapsulación.
Solución: en Kotlin, se puede declarar una propiedad de extensión, que se ve como una propiedad normal, pero se implementa en forma de funciones. Esto permite extender tipos a los que no tenemos acceso al código fuente de manera conveniente.
Ejemplo de código:
val String.firstChar: Char get() = this[0] println("Kotlin".firstChar) // K
Características clave:
¿Se puede agregar un backing field (estado) a una propiedad de extensión?
No, la propiedad de extensión solo calcula el valor sobre la marcha y no puede almacenar estado.
¿Pueden las propiedades de extensión anular propiedades en clases heredadas?
No, las propiedades de extensión (al igual que las funciones de extensión) son estáticas por naturaleza: no pueden ser anuladas o virtuales.
¿Cómo se compila una propiedad de extensión y por qué no es un análogo sintáctico de una propiedad normal?
La propiedad de extensión se compila en un getter estático (y/o setter) función. No están incluidos en las entidades de la clase y solo son visibles en el contexto del archivo donde se declaran.
Caso negativo
Un desarrollador intentó agregar una propiedad de extensión para almacenar el estado de "visitado" en las vistas estándar de Android:
var View.isVisited: Boolean get() = ... set(value) { ... } // Error: no hay almacenamiento
Pros:
Contras:
Caso positivo
Se implementó una propiedad de extensión para String para obtener un formato extendido:
val String.asTitle: String get() = this.replaceFirstChar { it.uppercase() }
Pros:
Contras: