La propriété doit être initialisée ou être abstraite

121

Ce doit être une question stupide, mais je suis vraiment nouveau à Kotlin et je n'ai trouvé aucune solution.

Comment déclarer le champ de classe? Comme on peut l'avoir en java:

protected SharedPreferences mSharedPreferences;

Et plus tard dans onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Maintenant, je peux l'utiliser où je veux (dans les sous-classes de cette activité de base).

J'essaye de faire de même à Kotlin:

protected var sharedPreferences : SharedPreferences

Et dans onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Mais j'obtiens un avertissement: "La propriété doit être initialisée ou être abstraite"

Anton Shkurenko
la source

Réponses:

188

Si vous souhaitez initialiser une propriété en dehors du constructeur, les propriétés initialisées tardivement sont peut-être ce que vous recherchez. Déclarez la propriété avec le lateinitmodificateur, ce qui permettra de sauter l'initialiseur autrement requis et fera échouer l'accès à la propriété avec exception jusqu'à ce qu'une valeur significative lui soit assignée:

protected lateinit var sharedPreferences: SharedPreferences
Alexandre Udalov
la source
12
J'ai essayé d'utiliser "protected var sharedPreferences: SharedPreferences? = Null" et cela fonctionne également, quelle est la différence?
Anton Shkurenko
Je vois que si j'utilise Dagger2 pour DI, je dois utiliser votre variante, non?
Anton Shkurenko
30
La différence est que vous pouvez déclarer des valeurs non Nullable avec lateinit.
Kirill Rakhman
15

Tirer cela des commentaires de la réponse d'Alexandre Udalov pour la visibilité. Pour les propriétés Nullable:

protected var sharedPreferences : SharedPreferences? = null

... et attribuez-lui une valeur plus tard.

Tom Howard
la source