【问题标题】:Kotlin val initialization using whenKotlin val 初始化使用 when
【发布时间】:2018-01-15 10:52:23
【问题描述】:

使用 Java 我可能想使用 switch 语句初始化最终变量:

final String finalValue;

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

在 Kotlin 中,尝试做同样的事情:

val finalValue: String

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

导致编译错误。
一个解决方案是使用by lazy 组合,但这会创建一个新的Lazy 实例。

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

有没有更好的方法来做到这一点?

【问题讨论】:

  • result in a compilation error > 指定编译错误。

标签: initialization kotlin field final


【解决方案1】:

这个结构怎么样:

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

使用when 作为表达式。

【讨论】:

  • 啊该死的。我忘记了在 Kotlin 中几乎所有东西都是一种表达方式。因此,何时是“可分配的”。感谢剩下的。
  • : String 在这种情况下是可选的。 ;)
【解决方案2】:

您也可以使用 init 块来初始化最终变量。

val finalValue: String

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

【讨论】:

    【解决方案3】:

    其实下面是编译的,不知道你遇到了什么问题?

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

    对我来说唯一的可能性:您将when 子句直接写入类主体,这肯定行不通。不过,您可以将其放入 init 块中。

    当然,在这里简单地使用when 表达式的功能会更好(IDE 也建议这样做):

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

    【讨论】:

    • 明白。我没有正确指定“else”分支上的分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多