Я не думаю, что это возможно без какой-либо обертки (или размышлений, но примерно через мгновение).
На самом деле, lateinit - это дизайн для совместимости с структурами DI и т. Д. Если вы знаете это значениеможет быть неинициализирован в любой момент, тогда вы должны использовать тип nullable
.
Итак, что насчет этого отражения? lateinit
на самом деле является своего рода умной оболочкой, в которой значение nullable
действует как not nullable
, и вместо броска NullPointerException
- UninitializedPropertyAccessException
. lateinit
свойство на момент объявления в JVM равно null
, поэтому давайте сделаем его снова null
;)
Итак ...
class MyClass {
lateinit var lateinitObject: Any
fun test() {
println("Is initialized: ${::lateinitObject.isInitialized}") // false
lateinitObject = Unit
println("Is initialized: ${::lateinitObject.isInitialized}") // true
resetField(this, "lateinitObject")
println("Is initialized: ${::lateinitObject.isInitialized}") // false
lateinitObject // this will throw UninitializedPropertyAccessException
}
}
fun resetField(target: Any, fieldName: String) {
val field = target.javaClass.getDeclaredField(fieldName)
with (field) {
isAccessible = true
set(target, null)
}
}
fun main() {
MyClass().test()
}
Итак, установив, чтополе в ноль (и это возможно только через отражение) делает это поле снова неинициализированным. И одна важная вещь - рассматривайте это как любопытство, а не как вещь, которая должна быть в вашем производственном коде.