В Kotlin, если вы не хотите инициализировать свойство класса внутри конструктора или в верхней части тела класса, у вас есть в основном эти две опции (из ссылки на язык):
lazy () - это функция, которая принимает лямбду и возвращает экземпляр Lazy, который может служить делегатом для реализации свойства lazy: первый вызов get () выполняет лямбду, переданную в lazy (), и запоминает результат, последующие вызовы get () просто возвращает запомненный результат.
пример
public class Hello { val myLazyString: String by lazy { "Hello" } }
Поэтому первый вызов и subquential звонков, где бы оно, к myLazyString вернется «Hello»
Обычно свойства, объявленные как имеющие ненулевой тип, должны быть инициализированы в конструкторе. Однако довольно часто это не удобно. Например, свойства могут быть инициализированы посредством внедрения зависимости или в методе настройки модульного теста. В этом случае вы не можете предоставить ненулевой инициализатор в конструкторе, но вы все равно хотите избегать нулевых проверок при обращении к свойству внутри тела класса.
Чтобы справиться с этим случаем, вы можете пометить свойство модификатором lateinit:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
Модификатор можно использовать только для свойств var, объявленных внутри тела класса (не в основном конструкторе), и только в том случае, если у свойства нет пользовательского метода получения или установки. Тип свойства должен быть ненулевым, и это не должен быть примитивный тип.
Итак, как правильно выбрать один из этих двух вариантов, поскольку оба они могут решить одну и ту же проблему?
lateinit
его фоновом поле отображается видимость сеттера, поэтому способы доступа к свойству из Kotlin и из Java различны. А из кода Java это свойство может быть установлено дажеnull
без каких-либо проверок в Kotlin. Поэтомуlateinit
не для ленивой инициализации, а для инициализации не обязательно из кода Котлина.