Intereting Posts
Пользовательский макет Android для просмотра списка Как настроить путь к исполняемому файлу Git в Android Studio? Ускоритель эмулятора Intel X86 (установщик HAXM) VT / NX не включен Как я могу добавить OnClickListener в Drawable в EditText? Как создать пользовательский BaseAdapter для AutoCompleteTextView Где я должен помещать файлы ttf в проект Android? Ошибка: нет такого свойства: GROUP для класса: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer FragmentManager NullPointerException при попытке commitAllowingStateLoss Обновите изображения на FragmentStatePagerAdapter при возобновлении активности Перезагрузка данных на вкладке, выбранной в фрагменте, с использованием пейджера просмотра Как подать виджет DatePicker с другими календарными системами? Как реализовать постоянную очередь на Android Вложение Gmail и пользовательское расширение Как проверить, существует ли файл SharedPreferences Исправлено: «Android: обнаружение фокуса / нажатый цвет»

Kotlin – lateinit VS Any? = Null

В Kotlin существует два метода объявления переменной внутри объекта, которая может быть нулевой и создана после создания объекта.

var myObject : Any? = null 

или

 var lateinit myObject : Any 

Я смущен тем, почему ключевое слово lateinit необходимо, если мы можем просто сделать var nullable и назначить его позже. Каковы плюсы и минусы каждого метода и в какой ситуации каждый должен использоваться?

Вот как я вижу разницу в соответствии с моими текущими знаниями в Котлине.

Первый:

 var myObject1 : Any? = null 

Здесь myObject1 – свойство, которое является нулевым. Это означает, что вы можете присвоить ему значение null .

Второй:

 lateinit var myObject2 : Any 

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

Короче говоря, основное отличие состоит в том, что myObject1 является нулевым, а myObject2 – непустым. Ключевое слово lateinit предоставляет вам механизм удобства, позволяющий инициализировать свойство non-null позднее, а не инициализировать его при объявлении.

Для получения дополнительной информации проверьте это .

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

? Используется в поле, когда поле будет инициализировано позже в вашей программе либо установщиком, либо внутри метода объекта, это должно заставить вас проверить нулевую или использовать нулевую безопасность ( ?. ) При ссылке на поле

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

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