Intereting Posts
Как сделать вывод типа Котлин из отражения KClass? DuplicateFileException в сборке apk с использованием Kotlin Широковещательный приемник onReceive () не вызывается Возможно ли вставить адаптер Recycler View с помощью кинжала 2.11 В чем разница между нормальным классом и классом данных в котлине Kotlin: Сделать внутреннюю функцию видимой для модульных тестов Не удается получить доступ к EditText или другим компонентам пользовательского интерфейса с помощью Kotlin Черты и модификация Котлина Создание класса данных с помощью KotlinPoet Выполнение не выполнено для задачи ': calculator: compileKonanKotlinArithmeticParserIphone' Есть ли способ вложить enum в класс данных в Котлин? Как я могу инициализировать переменную перед каждым тестом, используя kotlin-test framework Добавить kotlinx-html-js в проект kotlin / js в intellij Как разрушить конструктор в Котлине Контекст не может быть предоставлен без @ Provides- или @ Produces-аннотированного метода в kotlin

Разница между делегатами.notNull и lateinit Kotlin

Я очень смущен и выглядит, и работает очень похоже. На какой я должен пойти?

private var mMediaController by Delegates.notNull<MediaControllerCompat>() 

или

 lateinit private var mMediaController: MediaControllerCompat 

Применение:

  @Subscribe fun connectToSession(token: MediaSessionCompat.Token) { mMediaController = MediaControllerCompat(activity, token) mMediaController.registerCallback(mMediaControllerCallback) } 

Две модели аналогичны, и одна предшествует другой. Delegates.notNull() ( ссылка api ) основана на делегированных свойствах и была оригинальной, а позже появилась lateinit ( Late Initialized Properties ). Не охватывайте все возможные варианты использования, и ни один из них не должен использоваться, если вы не можете управлять жизненным циклом класса и точно знать, что они будут инициализированы до их использования.

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

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

Если тип, который вы используете, не поддерживается lateinit (не поддерживает примитивные типы), вы вынуждены использовать делегат.

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

Вы также можете прочитать дискуссионную тему « Улучшение латинита ».

  • notNull создает дополнительный объект для каждого свойства.

  • Объект небольшой, но если у вас много свойств, это может быть важно для вас.

  • Вы не можете использовать делегат notNull с внешними инструментами инжекции, которые вводят непосредственно в поля Java;

  • Вы не можете создать свойство lateinit примитивного типа (Int, Long и т. Д.).

  • lateinit дешевле, но вы можете использовать только делегат, когда ваше свойство имеет примитивный тип.

Источник: https://discuss.kotlinlang.org/t/notnull-delegate-vs-lateinit/1923/2