Na początku też ciężko było mi zrozumieć tę koncepcję. Pozwól, że wyjaśnię ci to na przykładzie.
Rozważ tę klasę Kotlin
class DummyClass {
var size = 0;
var isEmpty
get() = size == 0
set(value) {
size = size * 2
}
}
Teraz, gdy spojrzymy na kod, widzimy, że ma 2 właściwości, tj. - size
(z domyślnymi akcesoriami) i isEmpty
(z niestandardowymi akcesoriami). Ale ma tylko 1 pole tj size
. Aby zrozumieć, że ma tylko 1 pole, zobaczmy odpowiednik tej klasy w Javie.
Idź do Narzędzia -> Kotlin -> Pokaż Kotlin ByteCode w Android Studio. Kliknij Decompile.
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;
}
}
Wyraźnie widać, że klasa java ma tylko funkcje pobierające i ustawiające dla isEmpty
i nie ma zadeklarowanego dla niej pola. Podobnie w Kotlinie nie ma pola zapasowego dla właściwości isEmpty
, ponieważ właściwość w ogóle nie zależy od tego pola. Zatem nie ma pola zapasowego.
Teraz usuńmy niestandardowy pobierający i ustawiający isEmpty
właściwość.
class DummyClass {
var size = 0;
var isEmpty = false
}
A odpowiednikiem Java powyższej klasy jest
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;
}
}
Tutaj widzimy zarówno pola, jak size
i isEmpty
. isEmpty
jest polem zapasowym, ponieważ metoda pobierająca i ustawiająca isEmpty
właściwość zależy od niego.