[英]What is the purpose of explicit getters in kotlin?
在面向 object 的语言中,使用 getter 和 setter 是一种众所周知的做法。 这样做是为了更好地控制变量。 为了实现这一点,我们在 java 中将变量设为私有,因此我们需要 getter 和 setter。
但在 kotlin 中并非如此。 默认情况下,这里甚至通过 getter 和 setter 访问公共变量。 虽然 setter 可用于验证对变量的赋值,但 getter 只是返回存储的变量(我认为这就是为他们准备的)。 因此,根本不需要自定义 getter。
我还看到了此功能的一些错误用法,他们没有编写零参数 function,而是使用 val 并在 getter 中进行计算。 这会产生一种错觉,认为该事物只是一个 val,但实际上它不存储任何内容,而是每次都执行计算。
那么是否真的需要自定义吸气剂?
getter 只是返回存储的变量(我认为这就是为他们准备的)。 因此,根本不需要自定义 getter。
如果真是这样,为什么在 Java 中有吸气剂? 封装的目标之一是确保 class 的变化不会改变它的 API。 在 Kotlin 中也是如此。
我还看到了此功能的一些错误用法,他们没有编写零参数 function,而是使用 val 并在 getter 中进行计算。 这会产生一种错觉,认为该事物只是一个 val,但实际上它不存储任何内容,而是每次都执行计算。
对于自定义 getter,这是一个完全有效的用例。 在 Kotlin 中,不能假设使用属性完全没有开销。 在使用 getter 或零参数 function 的属性之间进行选择时,有很多问题要问自己:
walk()
, build()
等)firstName
, lastIndex
等)此外,属性 getter 不应该抛出异常,应该在第一次访问时计算成本低或缓存,并且应该为多次连续执行返回相同的结果。 以下是标准库中的示例:
ArrayDeque.first()
是一个 function,如果双端队列为空则抛出。List.lastIndex
是一个属性,计算起来很便宜。Lazy<T>.value
是一个属性,该值在首次访问时计算并缓存。大多数委托属性都使用自定义 getter。
更多阅读:
只是更多的信息。 除了可读性之外,定义自定义 getter 的可能性允许您在不更改其公共成员的情况下演变 class,即使您从没有自定义 getter 的简单val
开始。
在没有 Java 等属性的语言中,如果您定义公共字段:
public class Foo {
public final int value;
public Foo(int value) {
this.value = value;
}
}
然后稍后您想要修改 class 以添加一个功能,如果您翻转 Boolean,它将返回否定值,如果不破坏使用 ZA2F2ED4F8EBC2CBB4C21A29DC4 原始版本的代码,就无法做到这一点。 因此,您应该从一开始就使用 getter 和 setter。
但是在 Kotlin 中,你不能像这样直接暴露背景字段,所以不可能像在 Java 中使用公共字段那样在角落里画自己。 如果你原来的 class 是这样的:
class Foo(val value: Int)
您可以像这样修改它以添加该功能,并且对已经使用 class 的代码没有影响。
class Foo(private val originalValue: Int) {
var isNegated = false
val value: Int
get() = if (isNegated) -originalValue else originalValue
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.