La propiedad debe estar inicializada o ser abstracta

121

Debe ser una pregunta estúpida, pero soy realmente nuevo en Kotlin y no encontré ninguna solución.

¿Cómo declarar el campo de la clase? Como podemos tenerlo en java:

protected SharedPreferences mSharedPreferences;

Y más tarde en onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Ahora puedo usarlo en cualquier lugar que desee (en subclases de esta actividad base).

Intento hacer lo mismo en Kotlin:

protected var sharedPreferences : SharedPreferences

Y en onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

Pero recibo una advertencia: "La propiedad debe inicializarse o ser abstracta"

Anton Shkurenko
fuente

Respuestas:

187

Si desea inicializar una propiedad fuera del constructor, lo que puede estar buscando es propiedades inicializadas tardíamente . Declare la propiedad con el lateinitmodificador, lo que permitirá omitir el inicializador que de otro modo sería necesario y hará que el acceso a la propiedad falle con excepción hasta que se le asigne algún valor significativo:

protected lateinit var sharedPreferences: SharedPreferences
Alexander Udalov
fuente
12
Intenté usar "protected var sharedPreferences: SharedPreferences? = Null" y también funciona, ¿cuál es la diferencia?
Anton Shkurenko
Veo que si uso Dagger2 para DI, tengo que usar tu variante, ¿verdad?
Anton Shkurenko
30
La diferencia es que puede declarar valores que no aceptan valores NULL con lateinit.
Kirill Rakhman
15

Sacando esto de los comentarios de la respuesta de Alexander Udalov para la visibilidad. Para propiedades que aceptan valores NULL:

protected var sharedPreferences : SharedPreferences? = null

... y asígnele un valor más tarde.

Tom Howard
fuente