Con le classi sigillati è possibile utilizzare esaustive when
espressioni e omettere la clausola else
quando l'espressione restituisce un risultato:errore di compilazione Forza con le classi sigillate
sealed class SealedClass {
class First : SealedClass()
class Second : SealedClass()
}
fun test(sealedClass: SealedClass) : String =
when (sealedClass) {
is SealedClass.First -> "First"
is SealedClass.Second -> "Second"
}
Ora, se dovessi aggiungere una Third
-SealedClass
, il compilatore si lamenterà che l'espressione when
in test()
non è esaustiva e ho bisogno di aggiungere una clausola per Third
o else
.
Mi chiedo se questo controllo può anche essere applicata quando test()
non restituisce nulla:
fun test(sealedClass: SealedClass) {
when (sealedClass) {
is SealedClass.First -> doSomething()
is SealedClass.Second -> doSomethingElse()
}
}
Questo frammento non si rompe se si aggiunge Third
. È possibile aggiungere una dichiarazione return
prima del when
, ma questo potrebbe essere facilmente dimenticato e potrebbe interrompersi se il tipo di ritorno di una delle clausole non è Unit
.
Come posso essere sicuro di non dimenticare di aggiungere un ramo alle mie clausole when
?
Ho fatto la stessa domanda in Slack molto tempo fa, e AFAIR, non c'è altra soluzione che renderla un'espressione che restituisce qualcosa. Ma IntelliJ dovrebbe emettere un avvertimento se si dimentica una clausola, però (la mia domanda era per un enum, non una classe sigillata, ma dovrebbe essere la stessa). –
Hmm, si. Ho notato che posso rendere "Any?", E forzare un valore di ritorno, ma si sente ancora un po 'hacky. – nhaarman
Il mio preferito è il blocco di corsa. È leggibile, non cambia il tipo di ritorno della funzione da Unit a Any ?, e non è più o meno dimenticabile di aggiungere un return o un Any? tipo di ritorno. –