Kotlin – Как решить между «lateinit» и «nullable variable»?

Я путаюсь для lateinit и nullable переменной, которую можно использовать для переменной.

lateinit var c: String var d: String? = null c = "UserDefinedTarget" // if not added initialisation for c than throws UninitializedPropertyAccessException if (c == "UserDefinedTarget") { //do some stuff. } //not throws any exception whether d is initialise or not. if(d == "UserDefinedTarget") { //do some stuff } 

Тип, который является нулевым, – это только то, что имеет допустимое состояние, которое равно null.

Недействительный поздний init var представляет что-то, где null является недопустимым, но по какой-то причине его невозможно заполнить в конструкторе.

Активность Android – хороший пример использования lateinit. Действия должны иметь конструктор без аргументов, и их жизненный цикл действительно начинается с onCreate ().

Это две совершенно разные концепции.

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

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

С другой стороны, ненулевые типы используются, когда переменная может содержать null .


 class A { lateinit var a: String fun cat() { print(a.length) // UninitializedPropertyAccessException is thrown a = "cat" print(a.length) // >>> 3 } } class B { var b: String? = null fun dog() { print(b.length) // won't compile, null check is obligatory here print(b?.length) // >>> null b = "dog" print(b?.length) // >>> 3 } } 

Чтобы получить больше информации:

  • Поздно инициализированные свойства
  • Неверные типы

Это зависит. Необязательная переменная означает, что переменная может содержать значение или значение null. lateinit означает, что переменная должна быть инициализирована позже. Он должен быть инициализирован перед его доступом. Если вы попытаетесь получить доступ к неинициализированной переменной lateinit будет lateinit .

Всегда лучше избегать использования нулей в вашем приложении. Нули – зло. Поэтому, если вы можете инициализировать переменную в onCreate тогда лучше использовать lateinit . Также, если вы используете инъекцию зависимостей в своем приложении, а поля должны быть введены, это также действительный случай использования lateinit вместо обработки нулей.

Если по какой-то причине вы не можете инициализировать переменную, код инициализации может привести к нулевому значению или null может быть присвоен этой переменной позже, чем вы должны использовать переменную с нулевым значением. Вообще говоря, если значение null является допустимым значением для переменной.