La proprietà deve essere inizializzata o essere astratta


121

Deve essere una domanda stupida, ma sono davvero nuovo a Kotlin e non ho trovato alcuna soluzione.

Come dichiarare il campo della classe? Come possiamo averlo in java:

protected SharedPreferences mSharedPreferences;

E più tardi in onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Ora posso usarlo ovunque voglio (in sottoclassi di questa attività di base).

Provo a fare lo stesso a Kotlin:

protected var sharedPreferences : SharedPreferences

E in onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Ma ricevo un avviso: "La proprietà deve essere inizializzata o essere astratta"

Risposte:


187

Se desideri inizializzare una proprietà al di fuori del costruttore, le proprietà inizializzate in ritardo sono ciò che potresti cercare. Dichiarare la proprietà con il lateinitmodificatore, che consentirà di saltare l'inizializzatore altrimenti richiesto e farà fallire l'accesso alla proprietà con eccezione fino a quando non viene assegnato un valore significativo:

protected lateinit var sharedPreferences: SharedPreferences

12
Ho provato a usare "protected var sharedPreferences: SharedPreferences? = Null" e funziona anche, qual è la differenza?
Anton Shkurenko

Vedo che se uso Dagger2 per DI, devo usare la tua variante, giusto?
Anton Shkurenko

30
La differenza è che puoi dichiarare valori non annullabili con lateinit.
Kirill Rakhman

15

Tirando fuori questo dai commenti dalla risposta di Alexander Udalov per la visibilità. Per proprietà nullable:

protected var sharedPreferences : SharedPreferences? = null

... e assegnagli un valore in seguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.