Le extension properties sono estensioni per classi che consentono di aggiungere getter e setter senza la possibilità di aggiungere uno stato (backing field). In Java non esiste questa possibilità e l'analogo è la scrittura di metodi utilitari. Storicamente, per aggiungere funzionalità è stata utilizzata la scrittura di metodi statici o oggetti Wrapper.
Problema: nelle classi esterne spesso mancano le proprietà necessarie. Si desidera estendere una classe in modo conciso e sicuro, senza violare l'incapsulamento.
Soluzione: in Kotlin è possibile dichiarare un'extension property, che appare come una normale proprietà, ma è implementata come una funzione. Ciò consente di estendere i tipi ai quali non abbiamo accesso al codice sorgente in modo conveniente.
Esempio di codice:
val String.firstChar: Char get() = this[0] println("Kotlin".firstChar) // K
Caratteristiche chiave:
È possibile aggiungere un backing field (stato) a un'extension property?
No, l'extension property calcola solo il valore al volo e non può memorizzare lo stato.
Possono le extension properties sovrascrivere proprietà nelle classi ereditarie?
No, le extension properties (come le funzioni di estensione) sono statiche per natura: non possono essere sovrascritte o virtuali.
Come viene compilata l'extension property e perché non è un'analogia sintattica della normale proprietà?
L'extension property si compila in realtà in un getter statico (e/o setter) funzione. Non sono incluse nelle entità della classe e sono visibili solo nel contesto del file in cui sono dichiarate.
Caso negativo
Un sviluppatore ha tentato di aggiungere un'extension property per memorizzare lo stato di "visita" nei normali View di Android:
var View.isVisited: Boolean get() = ... set(value) { ... } // Errore: nessuna memorizzazione
Vantaggi:
Svantaggi:
Caso positivo
È stata implementata un'extension property per String per ottenere un formato esteso:
val String.asTitle: String get() = this.replaceFirstChar { it.uppercase() }
Vantaggi:
Svantaggi: