Forzar error de compilation con classs selladas

Con las classs selladas puede usar exhaustivas when expresiones y omiten la cláusula else cuando la expresión devuelve un resultado:

 sealed class SealedClass { class First : SealedClass() class Second : SealedClass() } fun test(sealedClass: SealedClass) : String = when (sealedClass) { is SealedClass.First -> "First" is SealedClass.Second -> "Second" } 

Ahora si tuviera que agregar un Third a SealedClass , el comstackdor se quejará de que la expresión when en test() no es exhaustiva, y necesito agregar una cláusula para Third o else .

Sin embargo, me pregunto si este control también se puede aplicar cuando test() no devuelve nada:

 fun test(sealedClass: SealedClass) { when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() } } 

Este fragment no se rompe si se agrega Third . Puedo agregar una statement de return antes de when , pero esto podría olvidarse fácilmente y puede romperse si el tipo de devolución de una de las cláusulas no es Unit .

¿Cómo puedo asegurarme de no olvidar agregar una twig a mis cláusulas when ?

La forma de aplicar exhaustivamente when es convertirla en una expresión utilizando su valor:

 sealed class SealedClass { class First : SealedClass() class Second : SealedClass() class Third : SealedClass() } fun test(sealedClass: SealedClass) { val x = when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() } // ERROR here // or when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() }.let {} // ERROR here } 

Inspirado por la respuesta de Voddan, puede build una propiedad llamada safe que puede usar:

 val Any?.safe get() = Unit 

Usar:

 when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() }.safe 

Creo que proporciona un post más claro que simplemente .let{} o asignar el resultado a un valor.


Hay un problema abierto en el rastreador de Kotlin que considera apoyar 'whens sellados'.

  • preguntas sobre DI, ViewModel, etc.
  • Estrategia JxBrowser para recuperar de manera eficiente el favicon
  • método getter arrojando StackOverflowError
  • Encuadernación en map con KClass Type
  • Se llama a Android RxJava onNext incluso cuando se anula la suscripción del observador
  • No se pudo encontrar org.jetbrains.kotlinx: kotlinx-html: 0.6.4
  • Kotlin stdlib operatios vs for loops
  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • Polimorfismo en las funciones de extensión en Kotlin
  • Android muestra una advertencia aparentemente inofensiva cuando se reproduce audio?
  • com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: se esperaba BEGIN_ARRAY pero estaba STRING en la ruta de la columna 1 de la línea 1