kotlin 中显式吸气剂的目的是什么?
What is the purpose of explicit getters in kotlin?
使用 getters 和 setter 是面向对象语言中众所周知的做法。这样做是为了更好地控制变量。为此,我们将 java 中的变量设为私有,因此我们需要 getter 和设置器。
但在 kotlin 中,情况并非如此。默认情况下,甚至 public 变量也可以通过 getters 和 setter 访问。虽然 setter 可用于验证对变量的赋值,但 getters 只是 return 存储的变量(我认为这就是他们的目的)。因此根本不需要自定义 getter。
我还看到一些错误使用此功能的地方,他们没有编写零参数函数,而是使用 val 并在 getter 中进行计算。这会产生一种错觉,认为它只是一个 val,但实际上它不存储任何东西,而是每次都执行计算。
那么是否真的需要定制 getter?
getters just return the variable as it is stored (and I think this is it for them). Hence custom getters are not required at all.
如果真是这样,为什么在 Java 中有 getter?封装的目标之一是确保 class 的变化不会改变它的 API。在 Kotlin 中也是如此。
I have also seen some wrong usage of this feature where instead of writing a zero argument function, they use a val and do the computation in the getter. This creates an illusion that the thing is just a val but in reality it does not store anything and instead it performs a computation every time.
这是一个完全有效的自定义用例 getter。在 Kotlin 中,不能假设使用 属性 是完全没有开销的。在 属性 与 getter 或零参数函数之间进行选择时,有很多问题要问自己:
- 它描述了行为吗?使用函数(
walk()
、build()
等)
- 它描述状态吗?使用 属性(
firstName
、lastIndex
等)
此外,属性 getter 不应该抛出异常,应该在第一次访问时计算成本低或缓存,并且 return 多次连续执行的结果应该相同.以下是标准库中的示例:
ArrayDeque.first()
是一个函数,如果双端队列为空则抛出。
List.lastIndex
是一个属性,算起来便宜
Lazy<T>.value
是一个 属性,该值是在第一次访问时计算和缓存的。
大多数委托属性使用自定义 getters。
更多阅读:
- Why use getters and setters/accessors?
- Kotlin: should I define Function or Property?
更多信息。除了可读性之外,定义自定义 getter 的可能性允许您在不更改其 public 成员的情况下发展 class,即使您从没有自定义的简单 val
开始getter.
在没有像 Java 这样的属性的语言中,如果您定义 public 字段:
public class Foo {
public final int value;
public Foo(int value) {
this.value = value;
}
}
然后你想修改 class 添加一个功能,如果你翻转一个布尔值,它 returns 取反值,如果不破坏使用原始代码的代码,就没有办法做到这一点class 的版本。所以你应该使用 getters 和 setters 开始。
但是在 Kotlin 中,您不能像这样直接公开一个支持字段,因此不可能像在 Java 中使用 public 字段那样在角落里画自己。如果你原来的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
}
使用 getters 和 setter 是面向对象语言中众所周知的做法。这样做是为了更好地控制变量。为此,我们将 java 中的变量设为私有,因此我们需要 getter 和设置器。
但在 kotlin 中,情况并非如此。默认情况下,甚至 public 变量也可以通过 getters 和 setter 访问。虽然 setter 可用于验证对变量的赋值,但 getters 只是 return 存储的变量(我认为这就是他们的目的)。因此根本不需要自定义 getter。
我还看到一些错误使用此功能的地方,他们没有编写零参数函数,而是使用 val 并在 getter 中进行计算。这会产生一种错觉,认为它只是一个 val,但实际上它不存储任何东西,而是每次都执行计算。
那么是否真的需要定制 getter?
getters just return the variable as it is stored (and I think this is it for them). Hence custom getters are not required at all.
如果真是这样,为什么在 Java 中有 getter?封装的目标之一是确保 class 的变化不会改变它的 API。在 Kotlin 中也是如此。
I have also seen some wrong usage of this feature where instead of writing a zero argument function, they use a val and do the computation in the getter. This creates an illusion that the thing is just a val but in reality it does not store anything and instead it performs a computation every time.
这是一个完全有效的自定义用例 getter。在 Kotlin 中,不能假设使用 属性 是完全没有开销的。在 属性 与 getter 或零参数函数之间进行选择时,有很多问题要问自己:
- 它描述了行为吗?使用函数(
walk()
、build()
等) - 它描述状态吗?使用 属性(
firstName
、lastIndex
等)
此外,属性 getter 不应该抛出异常,应该在第一次访问时计算成本低或缓存,并且 return 多次连续执行的结果应该相同.以下是标准库中的示例:
ArrayDeque.first()
是一个函数,如果双端队列为空则抛出。List.lastIndex
是一个属性,算起来便宜Lazy<T>.value
是一个 属性,该值是在第一次访问时计算和缓存的。
大多数委托属性使用自定义 getters。
更多阅读:
- Why use getters and setters/accessors?
- Kotlin: should I define Function or Property?
更多信息。除了可读性之外,定义自定义 getter 的可能性允许您在不更改其 public 成员的情况下发展 class,即使您从没有自定义的简单 val
开始getter.
在没有像 Java 这样的属性的语言中,如果您定义 public 字段:
public class Foo {
public final int value;
public Foo(int value) {
this.value = value;
}
}
然后你想修改 class 添加一个功能,如果你翻转一个布尔值,它 returns 取反值,如果不破坏使用原始代码的代码,就没有办法做到这一点class 的版本。所以你应该使用 getters 和 setters 开始。
但是在 Kotlin 中,您不能像这样直接公开一个支持字段,因此不可能像在 Java 中使用 public 字段那样在角落里画自己。如果你原来的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
}