Tenho uma classe em Kotlin que nunca quero que seja instanciada por meio do construtor primário. Ambos os construtores secundários acabam inicializando uma propriedade com base em seus parâmetros, e quero ter certeza de que a propriedade seja inicializada (o que não será com o construtor primário).
Gostaria de declarar minha propriedade como lateinit e, então, testar para garantir que ela foi inicializada antes que quaisquer métodos de classe sejam executados (por exemplo, como uma etapa final da construção), para gerar algum tipo de erro significativo. Não quero ter que introduzir guardas em cada método de classe.
Aqui está um exemplo:
class ElementsContainer() {
private lateinit var elements: Elements
constructor(url: String): this() {
val doc = Jsoup.connect(url).get()
elements = doc.body().select("*")
}
constructor(newElements: Elements): this() {
elements = newElements
}
...
}
Existe uma maneira de minha classe validar o que elements
foi inicializado como uma verificação final no final da construção (via this::elements.isInitialized
) e falhar na construção caso contrário (por exemplo, lançar uma exceção)?
Um dos seus construtores secundários simplesmente coloca a
Elements
instância na propriedade privada. O outro parece mais uma "função utilitária" para criar umaElements
instância do que um construtor. Isso provavelmente poderia ser melhor implementado assim:A
elements
propriedade ainda pode servar
se você precisar que seja. Também pode ser melhor mudarfromUrl
para uma função separadaobject
ou até mesmo para uma função de nível superior.Você pode tornar o construtor primário privado se não quiser que ele seja usado:
Mas se você quiser
elements
estar sempre disponível, você deve tornar isso obrigatório para o construtor primário: