Kotlin-инициализация свойств с использованием "по ленивому" против " lateinit"



в Kotlin если вы не хотите инициировать свойство класса внутри конструктора или в верхней части тела класса, у вас есть в основном эти два варианта (из ссылки на язык):





  1. Ленивая Инициализация



lazy () - это функция, которая принимает лямбду и возвращает экземпляр Lazy, который может служить делегатом для реализации свойства lazy: первый вызов get () выполняет лямбду, переданную lazy () и запоминает результат, последующие вызовы get () просто возвращают запомненный результат.



пример



public class Hello{

val myLazyString: String by lazy { "Hello" }`
}



Итак, первый вызов и субквенциальные вызовы, где бы он ни был, к myLazyString вернутся "Привет"




  1. Конце Инициализации





для обработки этого случая, вы можете пометить свойство с модификатором lateinit:



public class MyTest {

lateinit var subject: TestSubject

@SetUp fun setup() { subject = TestSubject() }

@Test fun test() { subject.method() }
}


модификатор может использоваться только на var свойства, объявленные внутри тела класса (не в основном конструкторе), и только тогда, когда свойство не имеет пользовательского геттера или сеттера. Тип свойства должен быть ненулевым и не должен быть примитивным типом.




Итак, как правильно выбрать между этими двумя вариантами, так как они оба могут решить ту же проблему ?

882   5  

5 ответов:

вот существенные различия между lateinit var и by lazy { ... } делегирован собственность:

  • lazy { ... } делегат может использоваться только для val свойства, в то время как lateinit может применяться только к vars, потому что он не может быть скомпилирован в виде

Additionnally к hotkeyхороший ответ, вот как я выбираю среди двух на практике:

lateinit для внешней инициализации: когда вам нужен внешний материал для инициализации вашего значения путем вызова метода.

например по телефону:

private lateinit var value: MyClass

fun init(externalProperties: Any) {
   value = somethingThatDependsOn(externalProperties)
}

пока lazy это когда он использует только внутренние зависимости для вашего объекта.

кредит идет на @Amit Shekhar

lateinit

lateinit-это поздняя инициализация.

пример:

public class Test {

  lateinit var mock: Mock

  @SetUp fun setup() {
     mock = Mock()
  }

  @Test fun test() {
     mock.do()
  }
}

лень

lazy-это ленивая инициализация.

lazy () - это функция, которая принимает лямбду и возвращает экземпляр lazy, который может служить делегатом для реализации свойства lazy: первый вызов get () выполняет лямбду, переданную lazy (), и запоминает результат, последующий вызовы get () просто возвращают запомненный результат.

пример:

public class Example{
  val name: String by lazy { “Amit Shekhar” }
}

очень краткий и лаконичный ответ!--1-->

lateinit: он инициализирует ненулевые свойства в последнее время

в отличие от ленивой инициализации, lateinit позволяет компилятору распознать, что значение ненулевого свойства не хранится на этапе конструктора для обычной компиляции.

ленивая инициализация

ленивый может быть очень полезно при осуществлении только для чтения(val) свойства, которые выполняют ленивую инициализацию в Kotlin.

ленивый { ... } выполняет инициализатор, в котором сначала используется определенное свойство, а не его объявление.

Если вы используете Spring container и хотите инициализировать ненулевое поле bean,lateinit лучше подходит.

@Autowired
lateinit var MyBean myBean

Comments

    Ничего не найдено.