【Realm】忘れがちなcloseは、拡張関数のuseを使うと便利【Kotlin】
本記事では、Realmの忘れがちな close
は、Kotlinの拡張関数 use
を使ったら便利だった、という小さな小さなTipsをご紹介します。
Realmのcloseを忘れがちな件
基本的にRealmのインスタンスを使用した場合、使い終わったら close
を呼ぶことになっていると思います。
ドキュメントにも、 Closing Realms というセクションにて記載があります。
https://realm.io/docs/java/5.8.0#closing-realms
しかしながら、GitHubでRealmを使っているプロジェクトを見てみると、 close
を呼んでいないものをちらほら見かけます。実際自分も忘れてしまっていたことがありました。。
ちなみに、Realmのトップページのサンプルコードでは close
を呼んでいる箇所がないため、必要ないと理解している方も一定数いるのかもしれません。
closeを忘れても動きはするが…
そんな忘れがちな close
ですが、別に呼ばなくてもクラッシュが起きたりなどがなく、動きはする模様です。
しかし、おかしな挙動をするケースがあるようで、一度削除したはずのデータが再度取得できる、というケースがありました。
実際のソースコードを記載することは出来ませんが、Androidアプリを例にすると
1. AActivity
から BActivity
を起動
2. BActivity
で特定のデータを削除( close
は呼ばない)
3. BActivity
をfinishして、 AActivity
に戻る
4. AActivity
でデータ一覧を取得すると、(2)で削除したはずのデータが何故か取得できた
という感じでした。
やはり close
は必ず呼んでおくほうがいいと言えそうです。
拡張関数「use」
ちょろちょろと前説しましたが、本題です。
close
を呼ぶ場合、下記のようにRealmインスタンスを使い終わったタイミングで close
すればいいのですが、これだとふとした時に忘れてしまうこともあるかと思います。
Realm realm = Realm.getDefaultInstance();
// ... realmインスタンスを使った処理 ...
realm.close(); // ← 忘れがち
そんなときに便利なのが、Kotlinの拡張関数 use
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html
Closeable
インターフェースを実装しているクラスに使用することができ、使用後に勝手に close
を呼んでくれるという拡張関数です。 Javaの try-with-resources
と同じようなもので、このようなものを Loan Pattern と呼ぶらしいです。
Realmは Closeable
を実装しているため、 use
を使ってみると…
Realm.getDefaultInstance().use { realm ->
// ... realmインスタンスを使った処理 ...
}
ちょっとばかしシンプルになったかと思います。
Realmのインスタンスもスコープがはっきりしているので、可読性も増したのではないでしょうか?
これで close
の呼び忘れもなくなりますね。
まとめ
Realmの close
は、Kotlinの拡張関数 use
を使うとシンプルに書けますし、 close
忘れもなくなるので、かなり便利だと感じました。
Kotlinには他にも便利な拡張関数があったりするので、色々と調べて、便利なやつはどんどん使っていきたいですね。
参考
Author And Source
この問題について(【Realm】忘れがちなcloseは、拡張関数のuseを使うと便利【Kotlin】), 我々は、より多くの情報をここで見つけました https://qiita.com/tsumuchan/items/c5e926a96229a92c1f06著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .