Как указано в документации, lateinit
специализируется на ненулевых свойствах:
Обычно свойства, объявленные как имеющие ненулевой тип , должны быть инициализированы в конструкторе. Однако довольно часто это не удобно. Например, свойства могут быть инициализированы посредством внедрения зависимости или в методе настройки модульного теста. В этом случае вы не можете предоставить ненулевой инициализатор в конструкторе, но вы все равно хотите избегать нулевых проверок при ссылке на свойство внутри тела класса.
Кроме того, если вы посмотрите на байт-код такого свойства lateinit
, вы увидите, что компилятор добавляет блок кода, чтобы гарантировать, что это свойство было инициализировано при обращении к нему. Для lateinit
свойств null
обозначает начальное, но недопустимое состояние свойств.
class WithLateInit {
lateinit var something : String
}
становится
public final class WithLateInit {
@NotNull
public String something;
@NotNull
public final String getSomething() {
String var10000 = this.something;
if (var10000 == null) { // <- here you can see the lateinit check
Intrinsics.throwUninitializedPropertyAccessException("something");
}
return var10000;
}
//setter
}