【问题标题】:kotlin property extensions vs local class extensions, which is better?kotlin 属性扩展与本地类扩展,哪个更好?
【发布时间】:2021-04-08 04:10:25
【问题描述】:

任何人都知道我为什么要使用property extension 而不是仅仅定义一个本地类扩展?这是我尝试过的属性扩展示例:

class MyClass {
    val String.concatMyName: String
        get() {
            return plus("FRED")
        }
}

用法可以是“我的名字是:”.concatMyName 但我也可以

class MyClass{
fun String.concatMyName2() =  this.plus("FRED")
}

用法是:“我的名字是:”.concatMyName2() 所以我还没有看到价值。

我认为可能的一个价值是它利用了 getter,因此不必将静态代码放入内存中。那只是节省吗?

【问题讨论】:

    标签: kotlin kotlin-extension


    【解决方案1】:

    两者非常相似,但也有一些细微的差别:

    • 如您所见,调用扩展 getter 不需要括号(圆括号),但调用扩展方法需要。

    • 在字节码级别,扩展 getter 有一个以 get 开头的方法名称,如果您是从 Java 或其他 JVM 语言调用它,这将很重要。

    • 这两个版本对阅读代码的人来说意味着不同的东西。从概念上讲,getter 返回对象状态的一部分,因此通常是一致的(在对象状态不变的情况下返回相同的值),没有可见的副作用,不太可能抛出异常,并且速度快(例如,无需建立网络调用或多头计算);它通常也与对相应设置器的调用一致。没有什么可以阻止您编写不符合这些要求的 getter,但它不符合 getter 的心理模型,因此可能会导致混淆/错误。而如果它确实合适,那么它作为吸气剂可能会更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多