最初,我也很难理解这个概念。所以让我在一个例子的帮助下向你解释。
考虑这个科特林级
class DummyClass {
var size = 0;
var isEmpty
get() = size == 0
set(value) {
size = size * 2
}
}
现在,当我们在看代码,我们可以看到它有2个属性即 - size
(默认存取)和isEmpty
(自定义访问器)。但它只有1个字段,即size
。要理解它只有1个字段,让我们看看这个类的Java等价物。
转到工具 - > Kotlin - >在Android Studio中显示Kotlin ByteCode。点击反编译。
public final class DummyClass {
private int size;
public final int getSize() {
return this.size;
}
public final void setSize(int var1) {
this.size = var1;
}
public final boolean isEmpty() {
return this.size == 0;
}
public final void setEmpty(boolean value) {
this.size *= 2;
}
}
显然,我们可以看到,在Java类只有getter和setter函数为isEmpty
,并没有宣布它领域。同样在Kotlin中,由于该属性完全不依赖于该字段,因此没有属性isEmpty
的后台字段。因此没有支持领域。
现在让我们删除isEmpty
属性的自定义getter和setter。
class DummyClass {
var size = 0;
var isEmpty = false
}
和Java当量的上述类是
public final class DummyClass {
private int size;
private boolean isEmpty;
public final int getSize() {
return this.size;
}
public final void setSize(int var1) {
this.size = var1;
}
public final boolean isEmpty() {
return this.isEmpty;
}
public final void setEmpty(boolean var1) {
this.isEmpty = var1;
}
}
这里我们可以看到两个领域size
和isEmpty
。 isEmpty
是后台字段,因为isEmpty
属性的获取器和设置器取决于它。
当然,作为Java开发人员,这个概念是每天使用一百万次的东西:)所有这些'private SomeClass字段;' – Strelok
在setter中使用属性本身会导致无限递归,因为将一些值赋给属性会一直打电话给二传手。 – funglejunk
@Strelok我的不好....我在假设阅读Kotlin的文档时'this.counter = value'与Java相同。 –