最初,我也很難理解這個概念。所以讓我在一個例子的幫助下向你解釋。
考慮這個科特林級
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相同。 –