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"

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.