Trong Kotlin nếu bạn không muốn khởi tạo một thuộc tính lớp bên trong hàm tạo hoặc ở phần trên cùng của thân lớp, về cơ bản bạn có hai tùy chọn này (từ tham chiếu ngôn ngữ):
Lazy () là một hàm lấy lambda và trả về một thể hiện của Lazy, có thể đóng vai trò là đại biểu để thực hiện một thuộc tính lười biếng: lệnh gọi đầu tiên để nhận () thực hiện lambda được chuyển đến lazy () và ghi nhớ kết quả, các cuộc gọi tiếp theo để có được () chỉ cần trả về kết quả đã nhớ.
Thí dụ
public class Hello { val myLazyString: String by lazy { "Hello" } }
Vì vậy, cuộc gọi đầu tiên và các cuộc gọi phụ, mọi lúc mọi nơi, đến myLazyString sẽ trả về "Xin chào"
Thông thường, các thuộc tính được khai báo là có loại không null phải được khởi tạo trong hàm tạo. Tuy nhiên, khá thường xuyên điều này là không thuận tiện. Ví dụ, các thuộc tính có thể được khởi tạo thông qua phép nội xạ phụ thuộc hoặc trong phương thức thiết lập của kiểm tra đơn vị. Trong trường hợp này, bạn không thể cung cấp trình khởi tạo không null trong hàm tạo, nhưng bạn vẫn muốn tránh kiểm tra null khi tham chiếu thuộc tính bên trong phần thân của một lớp.
Để xử lý trường hợp này, bạn có thể đánh dấu thuộc tính bằng công cụ sửa đổi lateinit:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
Công cụ sửa đổi chỉ có thể được sử dụng trên các thuộc tính var được khai báo bên trong phần thân của một lớp (không phải trong hàm tạo chính) và chỉ khi thuộc tính không có getter hoặc setter tùy chỉnh. Loại tài sản phải là không có giá trị và nó không phải là loại nguyên thủy.
Vậy, làm thế nào để chọn chính xác giữa hai tùy chọn này, vì cả hai đều có thể giải quyết cùng một vấn đề?
lateinit
hiển thị trường sao lưu của nó với khả năng hiển thị của trình thiết lập để cách các thuộc tính được truy cập từ Kotlin và từ Java là khác nhau. Và từ mã Java, thuộc tính này có thể được đặt ngay cả khinull
không có bất kỳ kiểm tra nào trong Kotlin. Do đó,lateinit
không phải để khởi tạo lười biếng mà là khởi tạo không nhất thiết phải từ mã Kotlin.