Me pregunto si hay una manera de verificar si una lateinitvariable 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?allSeriesvarseriesDir?.listFiles()?.map { it.name }?.toTypedArray(), que no es muy "bonita"if (seriesDir != null) {allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()}Respuestas:
Hay una
lateinitmejora en Kotlin 1.2 que permite verificar el estado de inicialización de lalateinitvariable directamente:Vea el anuncio en el blog de JetBrains o la propuesta KEEP .
ACTUALIZACIÓN: Kotlin 1.2 ha sido lanzado. Puedes encontrar
lateinitmejoras aquí:fuente
lateinittambién para variables locales, consulte kotlinlang.org/docs/reference/…::antesfile?Usando la
.isInitializedpropiedad uno puede verificar el estado de inicialización de una variable lateinit.fuente
Intente usarlo y recibirá un mensaje
UninitializedPropertyAccessExceptionsi no está inicializado.lateinites 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,lateinitpodría no ser la elección correcta.EDITAR: según lo que quieras hacer, algo como esto funcionaría mejor:
fuente
lateinithaya 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?isNullenlace 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
strdeTestclase enTest2clase. 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 lathispalabra clave antes::. A continuación se muestra el código de trabajo.fuente
Para verificar si
lateinit varse inicializó o no, utilice a.isInitializeden 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
.isInitializedfuente