🌱 KOTLIN IDIOMÁTICO: Valor padrão ou inicialização tardia?
June 3, 2022•269 words
Em Kotlin, o uso inicialização tardia torna inicialização fora do construtor bem mais elegante.
Em alguns casos não conseguimos injetar as propriedades via construtor, como em testes, e tendemos a aplicar um valor padrão, por exemplo:
var cobaia: Cobaia = null
// ... várias coisas até a cobaia estar disponível
cobaia = Myreli()
Isso é muito comum com testes, porque em vez de inicializar no construtor, inicializamos em uma etapa de setup para nos aproveitarmos da injeção de dependências com mocks e outros recursos. Por exemplo o código abaixo não é um bom teste:
class CobaiaSpec {
val cobaia: Cobaia = Myreli() // 😿
@Test fun test() {
cobaia.executarExperimentosMalucos()
}
}
Então precisamos inicializar no setup dos testes:
class CobaiaSpec {
var cobaia: Cobaia = null // 😿
@SetUp fun setUp() {
cobaia = Myreli() // 😺
}
@Test fun test() {
cobaia?.executarExperimentosMalucos() // 😿
}
}
Mas dar um valor padrão para uma variável simplesmente porque precisamos dela em diferentes sub contextos sempre trás um aspecto estranho. O kotlin resolve esse problema com a inicialização tardia:
class CobaiaSpec {
lateinit var cobaia: Cobaia // 😻
@SetUp fun setUp() {
cobaia = Myreli() // 😻
}
@Test fun test() {
cobaia.executarExperimentosMalucos()
}
}
Inicializar com null
(ou undefined
) é uma solução desagradável, mas as vezes inevitável. Gostei bastante da forma como Kotlin resolveu esse problema, tendo uma forma de declarar que aquela variável será inicializada em outro momento.
Referências
🌱 *Seedlings** são ideias que recém tive e precisam de cultivo, não foram revisadas ou refinadas. Saiba mais.*