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

В настоящее время я использую 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
Возврат из forEachLine Стоимость переключения потоков в RxJava и операции копирования класса данных Kotlin Что такое правильное место для инициализации переменных класса в котлине Обработка событий click в android kotlin: setOnClickListener работает только при двойном щелчке kotlin работает с ресурсами (массив и параметр функции) Является ли ключевое слово lateinit ненужным? Android (Kotlin) – CookieHandler не работает с методом POST, но с GET работает объекты закрытого класса, загадочно становящиеся нулевыми, если ссылаются на другие объекты-компаньоны Как продолжить обработку после ошибки в RxJava 2? Обратные вызовы Android и повторное использование кода Kotlin: Получение данных из Firebase Как установить метод тестового презентатора на основе возвращаемого значения Observable? каков рекомендуемый способ использования двойного удара Kotlin для элемента с нулевым классом Как рисовать линии с помощью drawLine () Подождите завершения задач подписчиков ConnectableObservable