A propriedade deve ser inicializada ou abstrata

121

Deve ser uma pergunta estúpida, mas eu sou muito novo em Kotlin e não encontrei nenhuma solução.

Como declarar o campo de classe? Como podemos ter em java:

protected SharedPreferences mSharedPreferences;

E mais tarde em onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Agora posso usá-lo em qualquer lugar que eu quiser (nas subclasses desta atividade de base).

Tento fazer o mesmo em Kotlin:

protected var sharedPreferences : SharedPreferences

E em onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Mas recebo um aviso: "A propriedade deve ser inicializada ou abstrata"

Anton Shkurenko
fonte

Respostas:

187

Se você gostaria de inicializar uma propriedade fora do construtor, então propriedades inicializadas tardiamente são o que você pode estar procurando. Declare a propriedade com o lateinitmodificador, o que permitirá pular o inicializador exigido de outra forma e fará com que o acesso à propriedade falhe com exceção até que algum valor significativo seja atribuído a ela:

protected lateinit var sharedPreferences: SharedPreferences
Alexander Udalov
fonte
12
Tentei usar "protected var sharedPreferences: SharedPreferences? = Null" e também funciona, qual é a diferença?
Anton Shkurenko
Vejo que se usar Dagger2 para DI, terei que usar sua variante, certo?
Anton Shkurenko em
30
A diferença é que você pode declarar valores não anuláveis ​​com lateinit.
Kirill Rakhman
15

Tirando isso dos comentários da resposta de Alexander Udalov para visibilidade. Para propriedades anuláveis:

protected var sharedPreferences : SharedPreferences? = null

... e atribua a ele um valor mais tarde.

Tom Howard
fonte