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"

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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.