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'.

  • Cómo abrir enlaces no relacionados con la URL de la vista web en el browser de la aplicación
  • Redacción de request de networking con RX y Kotlin
  • Cuando se utiliza Java / Kotlin para la progtwigción, se recomienda utilizar la recursion de queue o la versión iterativa. ¿Hay alguna diferencia en el performance?
  • Jacoco con gradle y kotlin no está creando el file jacoco.exec
  • Error del complemento Kotlin: no se pudo generar una class proxy para la class org.jetbrains.kotlin.gradle.tasks.KotlinCompile
  • A la class le falta un constructor sin arguments, pero he proporcionado un constructor sin arguments
  • Extender classs en generics de Kotlin
  • ¿Cómo puedo inicializar la variable antes de cada testing usando el marco kotlin-test
  • Cómo inicializar widgets en Android usando kotlin
  • Cómo encontrar el nombre de la variable de string-array en strings.xml
  • Encapsulando get el nombre del método en un método de ayuda