+6

Kotlin - Tutorial : Hiểu về lateinit vs lazy

Lateinit vs Lazy

Có rất nhiều tính năng tuyệt vời có sẵn trong Kotlin, chúng ta có thể tận dụng tất cả các tính năng này để viết ứng dụng tốt hơn trong Kotlin. Trong đó, Lateinit và Lazy là tính năng khởi tạo thuộc tính quan trọng. Chúng ta phải biết khi nào cần sử dụng khởi tạo thuộc tính nào.

1. Thuộc tính khởi tạo trong Kotlin

Nếu bạn không muốn khởi tạo một thuộc tính trong constructor, thì đây là hai cách khởi tạo đặc tính của Kotlin.

  • lateinit
  • lazy

2. Lateinit

Lateinit là khởi tạo sau. Thông thường, các thuộc tính được khai báo là có kiểu none-null phải được khởi tạo trong constructor. Tuy nhiên, điều này thường xuyên là không thuận tiện. Ví dụ, thuộc tính có thể được khởi tạo thông qua injection, hoặc trong phương pháp thiết lập unit test. Trong trường hợp này, bạn không thể cung cấp một trình khởi tạo none-null trong constructor, nhưng bạn vẫn muốn tránh kiểm tra null khi gọi thuộc tính bên trong class. Để xử lý trường hợp này, bạn có thể khai báo thuộc tính với lateinit.

public class Test {
    lateinit var mock: Mock

    @SetUp fun setup(){
        mock = Mock()
    }
    
    @Test fun test(){
        mock.do
    }
}

Các sửa đổi chỉ có thể được sử dụng trên các thuộc tính đã được khai báo var bên trong body của class (không phải trong constructor chính) và chỉ khi thuộc tính không có getter hoặc setter. Loại thuộc tính phải là none-null và nó không phải là kiểu nguyên thủy.

3. Lazy

Lazy là khởi tạo lười ( như tên gọi của nó) Lazy là một hàm lấy lambda và trả về một instance của lazy, có thể coi như là một đại diện thực hiện một thuộc tính lazy: Lần đầu tiên gọi get() thực thi lambda để trả về kết quả lazy() và nhớ lại kết quả, các lần gọi get() tiếp theo thì chỉ cần trả về kết quả nhớ

public class Example{
  val name: String by lazy { “Amit Shekhar” }
}

Bây giờ, Làm thế nào để viết sử dụng cái nào trong trường hợp nào?

Lazy chỉ có thể được sử dụng cho thuộc tính val, trong khi lateinit chỉ có thể được áp dụng cho var bởi vì nó không thể được biên dịch như trường final, do đó không thể đảm bảo được tính bất biến . lateinit var có thể được khởi tạo từ bất cứ nơi nào mà đối tượng được nhìn thấy. Nếu bạn muốn thuộc tính của bạn được khởi tạo từ bên ngoài theo cách có thể chưa biết trước, hãy sử dụng lateinit.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.