kotlin 属性 扩展与本地 class 扩展,哪个更好?
kotlin property extensions vs local class extensions, which is better?
有人知道我为什么要使用 property extension 而不是只定义本地 class 扩展吗?这是我尝试过的 属性 扩展的示例:
class MyClass {
val String.concatMyName: String
get() {
return plus("FRED")
}
}
用法可以是“我的名字是:”.concatMyName
但我也可以
class MyClass{
fun String.concatMyName2() = this.plus("FRED")
}
用法是:“我的名字是:”.concatMyName2()
所以我还没有看到价值。
我认为可能的一个价值是它利用了 getter 所以它不必将静态代码放在内存中。这仅仅是节省吗?
两者非常相似,但也有一些细微的差别:
如您所示,调用扩展 getter 不需要括号(圆括号),但调用扩展方法需要。
在字节码级别,扩展 getter 有一个以 get
开头的方法名称,如果您从 Java 调用它,这很重要或者另一种 JVM 语言。
这两个版本对于阅读代码的人来说意味着不同的东西。从概念上讲,对象状态的 getter returns 部分,因此通常是一致的(返回相同的值,而对象的状态不变),没有可见的副作用,不太可能抛出异常,并且快速(例如,无需进行网络调用或长时间计算);它通常也与对相应 setter 的调用一致。没有什么能阻止你写一个不符合这些的 getter,但是它不符合 getter 的心智模型,因此很可能会导致 confusion/bugs。而如果 确实 合适,那么 getter.
可能会更清楚
有人知道我为什么要使用 property extension 而不是只定义本地 class 扩展吗?这是我尝试过的 属性 扩展的示例:
class MyClass {
val String.concatMyName: String
get() {
return plus("FRED")
}
}
用法可以是“我的名字是:”.concatMyName 但我也可以
class MyClass{
fun String.concatMyName2() = this.plus("FRED")
}
用法是:“我的名字是:”.concatMyName2() 所以我还没有看到价值。
我认为可能的一个价值是它利用了 getter 所以它不必将静态代码放在内存中。这仅仅是节省吗?
两者非常相似,但也有一些细微的差别:
如您所示,调用扩展 getter 不需要括号(圆括号),但调用扩展方法需要。
在字节码级别,扩展 getter 有一个以
get
开头的方法名称,如果您从 Java 调用它,这很重要或者另一种 JVM 语言。这两个版本对于阅读代码的人来说意味着不同的东西。从概念上讲,对象状态的 getter returns 部分,因此通常是一致的(返回相同的值,而对象的状态不变),没有可见的副作用,不太可能抛出异常,并且快速(例如,无需进行网络调用或长时间计算);它通常也与对相应 setter 的调用一致。没有什么能阻止你写一个不符合这些的 getter,但是它不符合 getter 的心智模型,因此很可能会导致 confusion/bugs。而如果 确实 合适,那么 getter.
可能会更清楚