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

В настоящее время я использую 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