2016-02-29 37 views
12

Trong Kotlin, có vẻ như có hai phương thức khai báo một biến bên trong một đối tượng có thể rỗng và được khởi tạo sau khi đối tượng được tạo.Kotlin - lateinit VS Any? = null

var myObject : Any? = null 

hoặc

var lateinit myObject : Any 

Tôi đang bối rối về lý do tại sao từ khóa lateinit là cần thiết nếu chúng ta chỉ có thể làm cho var nullable và gán nó sau này. Những ưu và nhược điểm của từng phương pháp và trong trường hợp nào thì mỗi trường hợp nên được sử dụng?

Trả lời

13

Đây là cách tôi thấy sự khác biệt theo kiến ​​thức hiện tại của tôi trong Kotlin.

Đầu tiên một:

var myObject1 : Any? = null 

Đây myObject1 là một tài sản đó là nullable. Điều đó có nghĩa là bạn có thể chỉ định null cho nó.

Second một:

lateinit var myObject2 : Any 

Đây myObject2 là một tài sản phi null. Điều đó có nghĩa là bạn không thể chỉ định null cho nó. Thông thường nếu một thuộc tính là không null bạn phải khởi tạo nó tại khai báo. Nhưng việc thêm từ khóa lateinit cho phép bạn trì hoãn việc khởi tạo. Nếu bạn cố truy cập thuộc tính lateinit trước khi khởi tạo nó thì bạn sẽ nhận được một ngoại lệ.

Tóm lại sự khác biệt chính là myObject1 là một giá trị rỗng và myObject2 là một giá trị không. Từ khóa lateinit cung cấp cho bạn một cơ chế thuận tiện để cho phép một thuộc tính không rỗng được khởi tạo sau này thay vì khởi tạo nó tại khai báo.

Để biết thêm thông tin, hãy kiểm tra this.

4

lateinit từ khóa được sử dụng trên một trường để avoid kiểm tra trống khi tham chiếu trường bên trong đối tượng của bạn. Từ khóa chủ yếu được sử dụng khi bạn đang sử dụng tính năng tiêm phụ thuộc để khởi tạo biến hoặc khởi tạo biến trong phương pháp thiết lập của đơn vị thử nghiệm

? được sử dụng trên trường khi trường sẽ được khởi chạy sau này trong chương trình của bạn một setter hoặc bên trong của một phương pháp của đối tượng, điều này là để thực thi bạn để kiểm tra null hoặc sử dụng an toàn null (?.) khi tham chiếu trường

1

Nếu tài sản của bạn không được null, nhưng không được đặt sau một số điểm trong tương lai, nó là an toàn hơn để tuyên bố nó với một từ khóa lateinit. Điều đó đảm bảo rằng, nếu bạn truy cập nó trước khi nó được thiết lập, bạn sẽ nhận được một ngoại lệ giải thích chính xác điều đó.

Cách Java truyền thống là để ném một chung NullPointerException mà không giải thích về nó. Nếu bạn đã tự viết mã, bạn có thể có một đầu mối, nhưng nếu ai đó bắt lỗi, thì sẽ không rõ ràng lý do tại sao biến cụ thể đó là null.

Các vấn đề liên quan