Giới thiệu
Kotlin cung cấp hai cơ chế trì hoãn khởi tạo thuộc tính: lateinit và by lazy. Bài viết phân biệt và hướng dẫn sử dụng.
lateinit
Dùng từ khóa lateinit trước var. Điều kiện:
- Chỉ dùng với
var(mutable). - Chỉ cho kiểu non-null.
- Không dùng với kiểu nguyên thủy (Int, Double...).
- Không có getter/setter tùy chỉnh.
Ví dụ lateinit
class Tutorial {
lateinit var name: String
fun checkLateInit() {
if (this::name.isInitialized) {
println("Your value is not assigned")
} else {
name = "www.tutorialspoint.com/"
println(this.name)
}
}
}
fun main() {
var obj = Tutorial()
obj.checkLateInit()
}
Kết quả
www.tutorialspoint.com/
Lazy Initialization (by lazy)
Dùng val ... by lazy { ... }. Đặc điểm:
- Chỉ dùng với
val(immutable). - Kiểu non-null.
- Khởi tạo lần đầu khi truy cập, sau đó cache giá trị.
- Tránh khởi tạo không cần thiết.
Ví dụ by lazy
class Demo {
val myName: String by lazy {
println("Welcome to Lazy declaration")
"www.tutorialspoint.com"
}
}
fun main() {
var obj = Demo()
println(obj.myName)
println("Second time call to the same object--${obj.myName}")
}
Kết quả
Welcome to Lazy declaration www.tutorialspoint.com Second time call to the same object--www.tutorialspoint.com
Lần gọi thứ hai không in dòng "Welcome..." vì giá trị đã được cache.
Khi nào dùng cái nào?
- lateinit: Cần khởi tạo sau, có thể gán lại, dùng cho dependency injection, view binding.
- by lazy: Giá trị tính toán phức tạp, chỉ cần một lần, immutable.