Properti harus diinisialisasi atau abstrak

121

Itu pasti pertanyaan yang bodoh, tapi saya benar-benar baru mengenal Kotlin dan saya tidak menemukan solusi apa pun.

Bagaimana cara mendeklarasikan bidang kelas? Seperti kita bisa memilikinya di java:

protected SharedPreferences mSharedPreferences;

Dan nanti di onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Sekarang saya bisa menggunakannya di mana pun saya mau (dalam subclass aktivitas dasar ini).

Saya mencoba melakukan hal yang sama di Kotlin:

protected var sharedPreferences : SharedPreferences

Dan masuk onCreate() :

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Tapi saya mendapat peringatan: "Properti harus diinisialisasi atau abstrak"

Anton Shkurenko
sumber

Jawaban:

187

Jika Anda ingin menginisialisasi properti di luar konstruktor, properti yang diinisialisasi terlambat adalah yang mungkin Anda cari. Deklarasikan properti dengan lateinitpengubah, yang akan memungkinkan untuk melewati penginisialisasi yang diperlukan dan akan membuat akses properti gagal dengan pengecualian sampai beberapa nilai yang berarti diberikan padanya:

protected lateinit var sharedPreferences: SharedPreferences
Alexander Udalov
sumber
12
Saya mencoba menggunakan "protected var sharedPreferences: SharedPreferences? = Null" dan itu juga berfungsi, apa bedanya?
Anton Shkurenko
Saya melihat bahwa jika saya menggunakan Dagger2 untuk DI, saya harus menggunakan varian Anda, bukan?
Anton Shkurenko
30
Perbedaannya adalah Anda dapat mendeklarasikan nilai non-nullable dengan lateinit.
Kirill Rakhman
15

Menarik ini dari komentar jawaban Alexander Udalov untuk visibilitas. Untuk properti nullable:

protected var sharedPreferences : SharedPreferences? = null

... dan berikan nilainya nanti.

Tom Howard
sumber