Me pregunto si hay una manera de verificar si una lateinit
variable se ha inicializado. Por ejemplo:
class Foo() {
private lateinit var myFile: File
fun bar(path: String?) {
path?.let { myFile = File(it) }
}
fun bar2() {
myFile.whateverMethod()
// May crash since I don't know whether myFile has been initialized
}
}
File?
) y simplemente verifique si es nula?allSeries
varseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, que no es muy "bonita"if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Respuestas:
Hay una
lateinit
mejora en Kotlin 1.2 que permite verificar el estado de inicialización de lalateinit
variable directamente:Vea el anuncio en el blog de JetBrains o la propuesta KEEP .
ACTUALIZACIÓN: Kotlin 1.2 ha sido lanzado. Puedes encontrar
lateinit
mejoras aquí:fuente
lateinit
también para variables locales, consulte kotlinlang.org/docs/reference/…::
antesfile
?Usando la
.isInitialized
propiedad uno puede verificar el estado de inicialización de una variable lateinit.fuente
Intente usarlo y recibirá un mensaje
UninitializedPropertyAccessException
si no está inicializado.lateinit
es específicamente para casos donde los campos se inicializan después de la construcción, pero antes del uso real (un modelo que utilizan la mayoría de los marcos de inyección). Si este no es su caso de uso,lateinit
podría no ser la elección correcta.EDITAR: según lo que quieras hacer, algo como esto funcionaría mejor:
fuente
lateinit
haya inicializado una variable (que es ). En otras palabras: quiero que el botón esté deshabilitado siempre que la variable no se haya inicializado. ¿Hay una buena manera de hacer eso?isNull
enlace para deshabilitar los otros botones.Puedes hacer esto fácilmente:
o
Pero si estás dentro de un oyente o una clase interna, haz esto:
Nota: Las declaraciones anteriores funcionan bien si las escribe en el mismo archivo (misma clase o clase interna) donde se declara la variable, pero esto no funcionará si desea verificar la variable de otra clase (no la superclase o declarada en otro archivo) , por ejemplo:
Y para verificar si str está inicializado:
Lo que estamos haciendo accediendo al campo
str
deTest
clase enTest2
clase. Y obtenemos un error al respaldar el campo de var no es accesible en este momento. Revisa una pregunta ya planteada sobre esto.fuente
La respuesta aceptada me da un error de compilación
Kotlin 1.3+
, tuve que mencionar explícitamente lathis
palabra clave antes::
. A continuación se muestra el código de trabajo.fuente
Para verificar si
lateinit var
se inicializó o no, utilice a.isInitialized
en la referencia a esa propiedad:fuente
::
antesbar
?Bytecode dice ... bla, bla ...
L2 LOCALVARIABLE $ this Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1
Kotlin crea una variable local adicional de la misma instancia y comprueba si es nula o no, si es nula, arroja 'throwUninitializedPropertyAccessException' o devuelve el objeto local. Por encima del código de bytes explicado aquí Solución Desde kotlin 1.2 permite verificar el clima lateinit var se ha inicializado o no utiliza
.isInitialized
fuente