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.