Die Eigenschaft muss initialisiert oder abstrakt sein

121

Es muss eine dumme Frage sein, aber ich bin wirklich neu in Kotlin und habe keine Lösung gefunden.

Wie deklariere ich ein Klassenfeld? Wie wir es in Java haben können:

protected SharedPreferences mSharedPreferences;

Und später in onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Jetzt kann ich es überall verwenden (in Unterklassen dieser Basisaktivität).

Ich versuche dasselbe in Kotlin zu tun:

protected var sharedPreferences : SharedPreferences

Und in onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Aber ich bekomme eine Warnung: "Eigentum muss initialisiert oder abstrakt sein"

Anton Shkurenko
quelle

Antworten:

186

Wenn Sie eine Eigenschaft außerhalb des Konstruktors initialisieren möchten , suchen Sie möglicherweise nach spät initialisierten Eigenschaften . Deklarieren Sie die Eigenschaft mit dem lateinitModifikator, wodurch der ansonsten erforderliche Initialisierer übersprungen werden kann und der Eigenschaftszugriff mit Ausnahme fehlschlägt, bis ihm ein aussagekräftiger Wert zugewiesen wird:

protected lateinit var sharedPreferences: SharedPreferences
Alexander Udalov
quelle
12
Ich habe versucht, "protected var sharedPreferences: SharedPreferences? = Null" zu verwenden, und es funktioniert auch. Was ist der Unterschied?
Anton Shkurenko
Ich sehe, wenn ich Dagger2 für DI verwende, muss ich Ihre Variante verwenden, oder?
Anton Shkurenko
30
Der Unterschied besteht darin, dass Sie mit lateinit nicht nullfähige Werte deklarieren können.
Kirill Rakhman
15

Dies aus den Kommentaren aus Alexander Udalovs Antwort auf Sichtbarkeit herausziehen. Für nullfähige Eigenschaften:

protected var sharedPreferences : SharedPreferences? = null

... und weisen Sie ihm später einen Wert zu.

Tom Howard
quelle