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.