I, Late-initialized variable
- Thông thường, trong kotlin các
non-null member variablephải được khởi tạo khi khai báo. Tuy nhiên, trong nhiều trường hợp điều này không thuận tiện. - Kotlin cungx cho phép member variable khởi tạo sau bằng
lateinit(late initialization) keyword. - Ví dụ 1: property được khởi tạo thông qua dependency injection hoặc trong
setup()của unit test. Chúng ta có thể sử dụng lateinit để khai báo biến:
1 | public class MyTest { |
- Khi dùng lateinit chúng ta cần tuân theo các quy định sau:
- 1, Chỉ được dùng với
vartạo thànhlateinit varcho property ở trong class body. - 2, Không được dùng trong constructor và method.
- 3, Chỉ dùng cho các property không có custom getter và setter.
- 4, Chỉ dùng cho các property không null và không phải là primitive type.
- 1, Chỉ được dùng với
- Nếu truy cập lateinit var property trước khi nó được khởi tạo, chúng ta sẽ gặp exception.
- Do đó, để tránh exception chúng ta nên xác định xem lateinit var property đã được khởi tạo chưa.
- Để xác định lateinit var property đã được khởi tạo chưa, chúng ta sử dụng isInitialized như sau:
1 | lateinit var bar: Bar |
II, Lazy variable
- Đôi khi chúng ta muốn member variable được khởi tạo khi chúng ta cần dùng đến nó.
- Trong trường hợp như vậy chúng ta có thể sử dụng
lazy propertythông qualazy(). - lazy() là 1 function có tham số là 1 lambada và trả về 1 Lazy object:
- Lần đầu tiên gọi
get()của property thì biểu thức lambada của lazy() sẽ được xử lý, khởi tạo và ghi nhớ giá trị cho property đó. - Các lần gọi
get()tiếp theo, property sẽ lấy giá trị được ghỉ nhớ đó (không cần thực hiện lại lambada).
- Lần đầu tiên gọi
- Ví dụ 2: Lần đàu tiên sử dụng
name, lambada được xử lý do đóname = It life, đồng thời giá trị được ghỉ nhớ. Các lần sử dụngnametiếp theo thì vẫn có giá trị làIt life:
1 | public class Test{ |
- lazy() chỉ dùng cho các
valproperty.