Thuộc tính phải được khởi tạo hoặc trừu tượng


121

Đó hẳn là một câu hỏi ngu ngốc, nhưng tôi thực sự mới làm quen với Kotlin và tôi không tìm ra giải pháp nào.

Cách khai báo trường lớp? Giống như chúng ta có thể có nó trong java:

protected SharedPreferences mSharedPreferences;

Và sau đó trong onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Bây giờ tôi có thể sử dụng nó ở bất cứ đâu tôi muốn (trong các lớp con của hoạt động cơ sở này).

Tôi cố gắng làm điều tương tự trong Kotlin:

protected var sharedPreferences : SharedPreferences

Và trong onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Nhưng tôi nhận được cảnh báo: "Thuộc tính phải được khởi tạo hoặc phải là trừu tượng"

Câu trả lời:


187

Nếu bạn muốn khởi tạo một thuộc tính bên ngoài hàm tạo, thì các thuộc tính được khởi tạo muộn là những gì bạn có thể đang tìm kiếm. Khai báo thuộc tính với công cụ lateinitsửa đổi, điều này sẽ cho phép bỏ qua trình khởi tạo được yêu cầu khác và sẽ làm cho quyền truy cập thuộc tính không thành công với ngoại lệ cho đến khi một số giá trị có ý nghĩa được gán cho nó:

protected lateinit var sharedPreferences: SharedPreferences

12
Tôi đã cố gắng sử dụng "protected var sharedPreferences: SharedPreferences? = Null" và nó cũng hoạt động, sự khác biệt là gì?
Anton Shkurenko

Tôi thấy rằng nếu tôi sử dụng Dagger2 cho DI thì tôi phải sử dụng biến thể của bạn, phải không?
Anton Shkurenko

30
Sự khác biệt là bạn có thể khai báo các giá trị không thể nullable với lateinit.
Kirill Rakhman

15

Kéo điều này ra khỏi các bình luận từ câu trả lời của Alexander Udalov để hiển thị. Đối với thuộc tính nullable:

protected var sharedPreferences : SharedPreferences? = null

... và gán cho nó một giá trị sau đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.