gpt4 book ai didi

android - Kotlin 支持字段有什么用?

转载 作者:IT老高 更新时间:2023-10-28 13:16:09 28 4
gpt4 key购买 nike

作为一名 Java 开发人员,支持字段的概念对我来说有点陌生。给定:

class Sample {
var counter = 0 // the initializer value is written directly to the backing field
set(value) {
if (value >= 0) field = value
}
}

这个支持字段有什么用? Kotlin docs说:

Classes in Kotlin cannot have fields. However, sometimes it is necessary to have a backing field when using custom accessors.

为什么?在 setter 中使用属性名称本身有什么区别,例如。*

class Sample {        
var counter = 0
set(value) {
if (value >= 0) this.counter = value // or just counter = value?
}
}

最佳答案

因为,如果您没有 field 关键字,您将无法实际设置/获取 get() 中的值>设置(值)。它使您能够访问自定义访问器中的支持字段。

这是您的示例的等效 Java 代码:

class Sample {
private int counter = 0;
public void setCounter(int value) {
if (value >= 0) setCounter(value);
}
public int getCounter() {
return counter;
}
}

显然这并不好,因为 setter 只是对其自身的无限递归,从不改变任何东西。请记住,在 kotlin 中,每当您编写 foo.bar = value 时,它将被转换为 setter 调用而不是 PUFIELD


编辑:Java 有 fields 而 Kotlin 有 properties,这是一个比字段更高级别的概念。

有两种类型的属性:一种带有支持字段,一种没有。

具有支持字段的属性将以字段的形式存储值。该字段使将值存储在内存中成为可能。此类属性的一个示例是 Pairfirstsecond 属性。该属性将改变 Pair 的内存表示。

没有支持字段的属性必须以其他方式存储其值,而不是直接将其存储在内存中。它必须从其他属性或对象本身计算。此类属性的一个示例是 Listindices 扩展属性,它不是由字段支持的,而是基于 size 属性的计算结果.所以它不会改变 List 的内存表示(它根本不能这样做,因为 Java 是静态类型的)。​​

关于android - Kotlin 支持字段有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43220140/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com