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になるってつまり・・・(がくぶる)。

いじょ