繁体   English   中英

kotlin 中显式 getter 的目的是什么?

[英]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 的属性之间进行选择时,有很多问题要问自己:

  • 它描述行为吗? 使用 function ( walk()build()等)
  • 它是否描述了 state? 使用属性( firstNamelastIndex等)

此外,属性 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM