Usando Java, puedo querer inicializar una variable final usando una declaración de cambio:

final String finalValue;

switch (condition) {
   case 1:
      finalValue = "One";
      break;
   case 2:
      finalValue = "Two";
      break;
   case 3:
      finalValue = "Three";
      break;
   default:
      finalValue = "Undefined";
      break;
}

En Kotlin, tratando de hacer lo mismo:

val finalValue: String

when (condition) {
   1 -> finalValue = "One"
   2 -> finalValue = "Two"
   3 -> finalValue = "Three"
   else -> finalValue = "Undefined"
}

Resultar en un error de compilación.
Una solución está utilizando la combinación by lazy, pero esto crea una nueva instancia Lazy.

val finalValue: String by lazy {    
   when (condition) {
      1 -> "One"
      2 -> "Two"
      3 -> "Three"
      else -> "Undefined"
   }
}

¿Hay una mejor manera de lograr esto?

7
LppEdd 15 ene. 2018 a las 13:52

3 respuestas

La mejor respuesta

¿Qué tal esta construcción:


    val finalValue: String = when (condition) {
        1 -> "One"
        2 -> "Two"
        3 -> "Three"
        else -> "Undefined"
    }

Usando when como una expresión.

16
azizbekian 16 ene. 2018 a las 10:07

En realidad, lo siguiente se compila, no estoy seguro de qué problema encontraste.

fun x(condition: Int = 5) {
    val finalValue: String

    when (condition) {
        1 -> finalValue = "One"
        2 -> finalValue = "Two"
        3 -> finalValue = "Three"
        else -> finalValue = "Undefined"
    }
}

La única posibilidad para mí: escribió la cláusula when en un cuerpo de clase directamente, lo que ciertamente no funciona. Sin embargo, podría ponerlo en un bloque init.

Pero, por supuesto, es mucho mejor usar simplemente el poder de la expresión when aquí (que también sugiere el IDE):

val finalValue = when (condition) {
    1 -> "One"
    2 -> "Two"
    3 -> "Three"
    else -> "Undefined"
}
1
s1m0nw1 15 ene. 2018 a las 12:38

También puede usar el bloque init para inicializar una variable final.

val finalValue: String

init {
    finalValue = when (condition) {
        1 -> "One"
        2 -> "Two"
        3 -> "Three"
        else -> "Undefined"
    }
}
2
Avijit Karmakar 15 ene. 2018 a las 11:04
48261505