🌱 KOTLIN IDIOMÁTICO: Valor padrão ou inicialização tardia?

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.*