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"

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.