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"

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.