本記事では、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アプリを例にすると
-
AActivity
からBActivity
を起動 -
BActivity
で特定のデータを削除(close
は呼ばない) -
BActivity
をfinishして、AActivity
に戻る -
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には他にも便利な拡張関数があったりするので、色々と調べて、便利なやつはどんどん使っていきたいですね。
参考