JVMを再起動せずにリソース・バンドル(ResourceBundle.getBundle)を更新してみる!
Too Busyな火曜日...done.
1Q末ともなると、色々と忙しい毎日です。
そんな中、今頃になってResourceBundle.getBundleのAPI仕様が拡張されていることに気づいたのでメモメモ。
リソース・バンドルは動的に値変更できないものだと思っていた・・・
プロパティファイル(例:Hoge.properties)を用意して、可変な情報は設定ファイルへ外出しするのって、もはや常套手段ですよね。しかーし!Javaの場合、JVMプロセスを再起動しないと、更新されないと思い込んでいましたよっと・・・。
PlayStationだってそうでしょ・・・システムアップデートがあればヤレ再起動などと・・・言い訳・・・
J2SE5のAPIは以下の通り。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/ResourceBundle.html
static ResourceBundle getBundle(String baseName) static ResourceBundle getBundle(String baseName, Locale locale) static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
Java SE 6からは・・・
リソース・バンドルが強化されているのであった!
具体的には、以下のAPIが誕生していました。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/ResourceBundle.html
static ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control) static ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
引数;ResourceBundle.Controlがミソです。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/ResourceBundle.Control.html#getTimeToLive(java.lang.String, java.util.Locale)
このgetTimeToLiveってなんじゃらほい。と調べてみたら、「キャッシュの生存時間」らしく!
つまり、JVMプロセスが動いたままでも、キャッシュを短命にすることができる魔法のメソッドです。
てなことで実験
private final ResourceBundle getResource() { // ファイル名のベース名 final String BASENAME = "Hoge"; ResourceBundle resource = ResourceBundle.getBundle(BASENAME, new ResourceBundle.Control() { @Override public long getTimeToLive(String aBaseName, Locale aLocale) { // キャッシュを即死させます♪ return TTL_DONT_CACHE; } }); return resource; }
無名にしちゃって小汚いかもしれないけど、getTimeToLiveを@Overrideする。
おまけ
ちなみに、TTL_DONT_CASHEはlong値で・・・-1L
http://java.sun.com/javase/ja/6/docs/ja/api/constant-values.html#java.util.ResourceBundle.Control.TTL_DONT_CACHE
先日・・・日記した、すべてがFになるってつまり・・・(がくぶる)。
いじょ