Interfaccia sealed — è un tipo speciale di interfaccia in Kotlin che consente di limitare il numero delle sue implementazioni all'interno di un modulo. Le classi sealed sono apparse per la prima volta in Kotlin in precedenza, mentre le interfacce sealed sono state aggiunte a partire da Kotlin 1.5 come evoluzione per un maggiore controllo sui tipi partecipanti, ad esempio, nelle gerarchie di stati o nella gestione degli eventi.
In precedenza, gli sviluppatori utilizzavano classi sealed per limitare l'ereditarietà e creare gerarchie sicure. Tuttavia, per flessibilità e supporto di strutture in cui l'ereditarietà da più tipi è utile, sono state necessarie le interfacce sealed.
Senza le interfacce sealed, non è possibile gestire in modo flessibile l'insieme delle sottoclassi dell'interfaccia. Questo rende impossibile, ad esempio, un controllo esaustivo with quando si gestiscono stati, se tutto è costruito su interfacce e non solo su classi astratte/concrete.
L'uso di interfaccia sealed consente di:
Esempio di codice:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Evento Click") is Scroll -> println("Evento Scroll") }
Caratteristiche chiave:
Le interfacce sealed possono avere implementazioni al di fuori del file in cui sono dichiarate?
No, le implementazioni di un'interfaccia sealed devono trovarsi nello stesso modulo. Questo garantisce completezza e consente al compilatore di controllare il loro numero.
Come interagiscono le interfacce sealed con classi e oggetti?
Un'interfaccia sealed può essere implementata sia da classi normali che da oggetti, oltre che da data object (Kotlin 1.9+). Tale interfaccia può essere presente nell'ereditarietà multipla, cosa che non è possibile con una classe sealed.
sealed interface Operation object Add: Operation object Subtract: Operation
Le interfacce sealed possono essere annidate?
Sì, è possibile dichiarare un'interfaccia sealed sia all'interno di una classe sealed che sopra altre interfacce. L'importante è che tutte le implementazioni si trovino all'interno dello stesso modulo.
Nell'applicazione, gli stati UI sono stati descritti semplicemente come interfacce senza modificatore sealed. È stata dimenticata un'implementazione, e l'analisi statica non l'ha catturata; l'errore è emerso solo in produzione.
Pro:
Contro:
Utilizzo di un'interfaccia sealed per il modello di eventi dello schermo. Tutte le implementazioni si trovano all'interno dello stesso file del modulo, il compilatore avvisa in caso di rami non chiusi quando viene dimenticato un caso in when.
Pro:
Contro: