Ban đầu, tôi cũng đã có một thời gian khó khăn để hiểu khái niệm này. Vì vậy, hãy để tôi giải thích cho bạn với sự giúp đỡ của một ví dụ.
xem xét lớp Kotlin này
class DummyClass {
var size = 0;
var isEmpty
get() = size == 0
set(value) {
size = size * 2
}
}
Bây giờ khi chúng ta nhìn vào mã này, chúng ta có thể thấy rằng nó có 2 tính chất tức là - size
(với accessors mặc định) và isEmpty
(với accessors tùy chỉnh). Nhưng nó chỉ có 1 trường, tức là size
. Để hiểu rằng nó chỉ có 1 trường, chúng ta hãy xem Java tương đương với lớp này.
Đi tới Công cụ -> Kotlin -> Hiển thị Kotlin ByteCode trong Android Studio. Nhấp vào 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;
}
}
Rõ ràng chúng ta có thể thấy lớp java chỉ có hàm getter và setter cho isEmpty
và không có trường nào được khai báo cho nó. Tương tự như vậy trong Kotlin, không có trường sao lưu cho thuộc tính isEmpty
, vì thuộc tính không phụ thuộc vào trường đó. Do đó không có trường sao lưu.
Bây giờ, hãy để chúng tôi loại bỏ công cụ tùy chỉnh và thiết lập thuộc tính isEmpty
.
class DummyClass {
var size = 0;
var isEmpty = false
}
Và tương đương Java của lớp trên là
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;
}
}
đây chúng ta thấy cả hai lĩnh vực size
và isEmpty
. isEmpty
là một lĩnh vực sao lưu vì getter và setter cho tài sản isEmpty
phụ thuộc vào nó.
Chắc chắn là nhà phát triển Java khái niệm này là thứ mà bạn sử dụng hàng triệu lần mỗi ngày :) Tất cả những trường 'Private SomeClass; ' – Strelok
Sử dụng chính thuộc tính trong setter sẽ dẫn đến việc đệ quy vô tận kể từ khi gán một giá trị cho thuộc tính sẽ luôn gọi setter. – funglejunk
@Strelok tệ của tôi .... Tôi đã giả định rằng 'this.counter = value' này giống với Java tương đương khi đọc tài liệu của Kotlin. –