●ResourceBundleの読み込みを制御する方法

JDK 6.0以上

JDK6.0からResourceBundleのインスタンス取得メソッドに新しいものが追加されました。
java.util.ResourceBundle.getBundle(java.lang.String, java.util.ResourceBundle.Control)
2つ目の引数にjava.util.ResourceBundle.Controlを渡すものです。
このjava.util.ResourceBundle.Controlを指定することでResourceBundleの読み込みをコントロールすることができます。
通常はjava.util.ResourceBundle.Control.getControl(java.util.List)
  • java.util.ResourceBundle.Control.FORMAT_PROPERTIES
  • java.util.ResourceBundle.Control.FORMAT_CLASS
  • java.util.ResourceBundle.Control.FORMAT_DEFAULT
を指定して標準の実装からControlインスタンスを生成できますが、
より柔軟な制御を行う為にControlクラスを継承して必要な箇所をオーバーライドして使用できます。

public class CacheControl extends Control {

	/**
	 * @see java.util.ResourceBundle.Control#getCandidateLocales(java.lang.String, java.util.Locale)
	 */
	@Override
	public List getCandidateLocales( String baseName , Locale locale ) {
		// ここを実装
		return super.getCandidateLocales( baseName , locale );
	}

	/**
	 * @see java.util.ResourceBundle.Control#getFallbackLocale(java.lang.String, java.util.Locale)
	 */
	@Override
	public Locale getFallbackLocale( String baseName , Locale locale ) {
		// ここを実装
		return super.getFallbackLocale( baseName , locale );
	}

	/**
	 * @see java.util.ResourceBundle.Control#getFormats(java.lang.String)
	 */
	@Override
	public List getFormats( String baseName ) {
		// ここを実装
		return super.getFormats( baseName );
	}

	/**
	 * @see java.util.ResourceBundle.Control#getTimeToLive(java.lang.String, java.util.Locale)
	 */
	@Override
	public long getTimeToLive( String baseName , Locale locale ) {
		// ここを実装
		return super.getTimeToLive( baseName , locale );
	}

	/**
	 * @see java.util.ResourceBundle.Control#needsReload(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, java.util.ResourceBundle, long)
	 */
	@Override
	public boolean needsReload( String baseName , Locale locale , String format , ClassLoader loader , ResourceBundle bundle , long loadTime ) {
		// ここを実装
		return super.needsReload( baseName , locale , format , loader , bundle , loadTime );
	}

	/**
	 * @see java.util.ResourceBundle.Control#newBundle(java.lang.String, java.util.Locale, java.lang.String, java.lang.ClassLoader, boolean)
	 */
	@Override
	public ResourceBundle newBundle( String baseName , Locale locale , String format , ClassLoader loader , boolean reload ) throws IllegalAccessException , InstantiationException , IOException {
		// ここを実装
		return super.newBundle( baseName , locale , format , loader , reload );
	}

	/**
	 * @see java.util.ResourceBundle.Control#toBundleName(java.lang.String, java.util.Locale)
	 */
	@Override
	public String toBundleName( String baseName , Locale locale ) {
		// ここを実装
		return super.toBundleName( baseName , locale );
	}

}

例えば、常に最新の内容を読み込む為にキャッシュを無効にする場合、

public class CacheControl extends Control {
	/**
	 * @see java.util.ResourceBundle.Control#getTimeToLive(java.lang.String,java.util.Locale)
	 */
	@Override
	public long getTimeToLive( String baseName , Locale locale ) {
		// キャッシュは無効.
		return TTL_DONT_CACHE;
	}
}

とすることでキャッシュの有効期間を無効にすることができます。