【问题标题】:How can I modify val members during construction in Kotlin如何在 Kotlin 构建期间修改 val 成员
【发布时间】:2018-08-02 12:51:42
【问题描述】:

在 Java 中,我可以在构造函数中修改 final 成员。请看下面的例子

class Scratch {

  private final String strMember;

  public Scratch(String strParam) {
    this.strMember = strParam.trim();
  }        
}

Kotlin 中有没有办法在构造过程中修改val 成员,在这种情况下修改trim() 他们在参数值被分配给字段之前。

如果不是,在不产生过多开销的情况下,推荐的解决方法是什么?

【问题讨论】:

    标签: constructor kotlin final


    【解决方案1】:

    您可以向构造函数声明一个未标记为valvar 的参数。这对构造函数来说是本地的,一旦类构造完成就会丢失。接受该参数并将其设置为您想要的任何值。

    class Scratch(str: String) {
        private val strMember = str.trim()
    }
    

    【讨论】:

    • 啊,看起来很简洁。但不能与 data 类一起使用?
    • 我认为这不是数据类的好用,TBH。这是一个很好的答案(对于一个稍微不同的问题,但基本相同),涵盖了为什么以及如何解决它:stackoverflow.com/a/46376746/49746
    • 我也没有越处理它。数据类倾向于支持贫乏的领域模型,而不是具有多重继承的丰富领域对象。
    【解决方案2】:

    像这样:构造函数参数在属性初始化期间可用。

    class Scratch(strParam:String) {
        private val strMember = strParam.trim()
    }
    

    【讨论】:

      【解决方案3】:

      按照以下方式尝试您的strParam final property

      class Scratch(strParam : String) {
          val strParam : String = strParam 
              get() = field.trim()
      }
      

      因此,您可以在 Scratch class 内外使用它们

      【讨论】:

      • 这似乎效率不高,因为每个 get() 调用都会执行 trim 并分配新的 String 实例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多