2015-11-21 14 views
34

Nó phải là câu hỏi ngu ngốc, nhưng tôi thực sự mới với Kotlin và tôi không tìm thấy bất kỳ giải pháp nào.Tài sản phải được khởi tạo hoặc trừu tượng

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

protected SharedPreferences mSharedPreferences; 

Và sau này trong onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) 

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

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

protected var sharedPreferences : SharedPreferences 

Và trong onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) 

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

Trả lời

66

Nếu bạn muốn khởi tạo thuộc tính bên ngoài hàm tạo, sau đó late-initialized properties là những gì bạn có thể đang tìm kiếm. Kê khai tài sản với modifier lateinit, mà sẽ cho phép bỏ qua initializer có quy định khác và sẽ làm cho khả năng tiếp cận tài sản thất bại 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 
+3

Tôi cố gắng để sử dụng "sharedPreferences var bảo vệ: SharedPreferences? = Null "và nó cũng hoạt động, sự khác biệt là gì? –

+0

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

+11

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

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