【问题标题】:How do I initialize a final field in Kotlin?如何在 Kotlin 中初始化 final 字段?
【发布时间】:2021-06-17 07:15:58
【问题描述】:

假设我用 private final String s (Java) 或 val s (Kotlin) 声明了一个 final 字段。在初始化期间,我想用调用远程服务的结果来初始化该字段。在 Java 中,我可以在构造函数中初始化它(例如s = RemoteService.result()),但在 Kotlin 中,我不知道该怎么做,因为据我所知,该字段必须在同一行中初始化宣布。这里有什么解决办法?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    您可以在初始化块中设置val 值:

    class MyClass {
    
        val s: String
    
        init {
            s = "value"
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您也可以使用by lazy 初始化值,该值将在第一次被引用时被初始化。一个例子

      val s by lazy { RemoteService.result() }
      

      kotlin 会根据表达式的返回类型猜测 s 的类型。

      【讨论】:

        【解决方案3】:

        自从 Kotlin 的第一个正式稳定版本发布以来,就可以像这样简单地做到这一点:

        class MyClass {
            val s = RemoteService.result()
        }
        

        【讨论】:

          【解决方案4】:

          你可以使用run:

          class MyClazz {
              val prop = run {
                  // do stuff
                  // do stuff again
                  123 // return expression
              }
          }
          

          来自docs(重点是我的):

          除了在接收器对象上调用run,您还可以将其用作非扩展函数。 非扩展 run 允许您在需要表达式的情况下执行由多个语句组成的块。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-25
            • 2014-10-23
            • 1970-01-01
            • 2016-08-22
            相关资源
            最近更新 更多