Gostaria de saber se existe uma maneira de verificar se uma lateinit
variável foi inicializada. Por exemplo:
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?
) e verifique se ela é nula?allSeries
var paraseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, o que não é muito "bonito"if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Respostas:
Há uma
lateinit
melhoria no Kotlin 1.2 que permite verificarlateinit
diretamente o estado de inicialização da variável:Veja o comunicado no blog JetBrains ou a proposta KEEP .
ATUALIZAÇÃO: Kotlin 1.2 foi lançado. Você pode encontrar
lateinit
melhorias aqui:fonte
lateinit
também para variáveis locais, consulte kotlinlang.org/docs/reference/…::
antesfile
?Usando a
.isInitialized
propriedade, é possível verificar o estado de inicialização de uma variável lateinit.fonte
Tente usá-lo e você receberá um
UninitializedPropertyAccessException
se não for inicializado.lateinit
é especificamente para casos em que os campos são inicializados após a construção, mas antes do uso real (um modelo usado pela maioria das estruturas de injeção). Se esse não for seu caso de usolateinit
pode não ser a escolha certa.EDIT: Com base no que você deseja fazer algo assim funcionaria melhor:
fonte
lateinit
) tenha sido inicializada. Em outras palavras: desejo que o botão seja desativado enquanto a variável não tiver sido inicializada. Existe uma boa maneira de fazer isso?isNull
ligação para desativar os outros botões.Você pode fazer isso facilmente:
ou
Mas se você estiver dentro de um ouvinte ou classe interna, faça o seguinte:
Nota: As instruções acima funcionam bem se você as estiver gravando no mesmo arquivo (mesma classe ou classe interna) em que a variável é declarada, mas isso não funcionará se você desejar verificar a variável de outra classe (não a superclasse ou declarada em outro arquivo) , por exemplo:
E para verificar se str é inicializado:
O que estamos fazendo aqui acessando o campo
str
deTest
classe emTest2
classe. E obtemos um erro ao fazer o campo var não estar acessível neste momento. Verifique uma pergunta já levantada sobre isso.fonte
A resposta aceita gera um erro do compilador.
Kotlin 1.3+
Eu tive que mencionar explicitamente athis
palavra - chave antes::
. Abaixo está o código de trabalho.fonte
Para verificar se a
lateinit var
foi inicializado ou não use a.isInitialized
na referência a essa propriedade:fonte
::
antesbar
?Bytecode diz ... blá blá ..
L2 LOCALVARIABLE $ this Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1
O Kotlin cria uma variável local extra da mesma instância e verifica se ela é nula ou não, se nula lança 'throwUninitializedPropertyAccessException' ou então retorna o objeto local. O bytecode acima explicado aqui Solução Como o kotlin 1.2, ele permite verificar se o lateinit var foi inicializado ou não está sendo usado
.isInitialized
fonte