Лотовое использование Котлин

В настоящее время я использую Realm в своем приложении, и чтобы убедиться, что я правильно управляю экземплярами Realm, я представил в своей базе Activity Activity такую ​​переменную:

protected val realm: Realm by lazy { Realm.getDefaultInstance() } 

А потом в onDestroy я делаю это:

 override fun onDestroy() { super.onDestroy() realm.close() } 

И тогда я понял, что это пустая трата. Если текущая деятельность не использует область, она откроется и сразу закроется в onDestroy .

Поэтому я обновил это:

  private var usedRealm = false protected val realm: Realm by lazy { usedRealm = true Realm.getDefaultInstance() } override fun onDestroy() { super.onDestroy() if (usedRealm) { realm.close() } } 

Есть ли способ сделать то же самое, без дополнительного флага?

  1. В вашей текущей реализации есть ошибка. Если Realm.getDefaultInstance() выбрасывает usedRealm будет установлено значение true но ленивый на самом деле не будет инициализирован (инициализация завершится неудачно). Вы можете исправить это, только вызвав usedRealm = true после вызова Realm.getDefaultInstance() :

     protected val realm: Realm by lazy { val realm = Realm.getDefaultInstance() usedRealm = true realm } 

    или

     protected val realm: Realm by lazy { Realm.getDefaultInstance().apply { usedRealm = true } } 
  2. Вы можете сделать то же самое без дополнительного флага, сохранив ссылку на исходный объект Lazy :

     private val lazyRealm = lazy { Realm.getDefaultInstance() } protected val realm by lazyRealm override fun onDestroy() { super.onDestroy() if (lazyRealm.isInitialized()) { realm.close() } } 

    Это все еще требует дополнительного поля, но вам больше не нужно поддерживать состояние инициализации самостоятельно.

  3. Вы также можете использовать Lazy напрямую, а не как делегат :

     protected val lazyRealm = lazy { Realm.getDefaultInstance() } override fun onDestroy() { super.onDestroy() if (lazyRealm.isInitialized()) { lazyRealm.value.close() } } 

    или

     protected val lazyRealm = lazy { Realm.getDefaultInstance() } override fun onDestroy() { super.onDestroy() with(lazyRealm) { if (isInitialized()) { value.close() } } } 

    Это делает его таким, что нет лишней собственности, но Lazy теперь является частью вашего API и везде, где вы бы просто ссылались на realm вам теперь нужно ссылаться на lazyRealm.value . Вы можете взвесить плюсы и минусы. 🙂

Intereting Posts
Настроить автоматическое завершение IntelliJ для сценария градиента в kotlin android – Запуск приложения с ошибкой «com.android.builder.dexing.DexArchiveMergerException: невозможно слить dex ' Рефакторинг кода Котлина Как получить текущую локальную дату и время в Котлин RecyclerView добавляет «пустой» элемент макета, и когда я нажимаю его, приложение падает объекты закрытого класса, загадочно становящиеся нулевыми, если ссылаются на другие объекты-компаньоны Ошибка: не удалось разрешить версию для зависимости «org.jetbrains.kotlin: kotlin-stdlib-jre7: jar ' Что такое эквивалент Kotlin строки Java ? Как использовать selectableButtonBackground на Anko? Котлинский эквивалент Optional.map и ссылка на метод Ошибка Android 3.0 Canary: Неподдерживаемая версия major.minor 52.0 Создание прослушивателя TCP в Котлине Этот тип имеет конструктор и должен быть инициализирован здесь – Kotlin Не иметь доступа к контроллеру Spring boot, но иметь доступ к index.html Обновление настроек уведомлений для Android-приложений