Котлин-латейнит VS любой? = недействительный

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

var myObject : Any? = null

или

var lateinit myObject : Any  

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

3 ответов


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

первый:

var myObject1 : Any? = null

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

второй:

lateinit var myObject2 : Any

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

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

более подробная информация этой.


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

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


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

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