【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には他にも便利な拡張関数があったりするので、色々と調べて、便利なやつはどんどん使っていきたいですね。

参考