Класс ResourceBundle уже реализует кеш, поэтому нет необходимости реализовывать кеширование самостоятельно. Ваш класс доступа может быть реализован как синглтон. Для переключения языка я использую ThreadLocal для локали:
public final class ThreadLocale extends ThreadLocal<Locale>
{
public static final ThreadLocale theInstance = new ThreadLocale ();
private ThreadLocale ()
{
super ();
}
protected Locale initialValue()
{
return Locale.getDefault ();
}
}
В методе класса доступа, который получает текст из пакета ресурсов, я использую текущую локаль потока:
public synchronized String getMessage (Object messageKey, Locale locale) throws MissingResourceException
{
ResourceBundle resourceBundle = null;
resourceBundle = ResourceBundle.getBundle (filename, ThreadLocale.theInstance.get ());
return resourceBundle.getString (messageKey.toString ());
}
Таким образом, вы можете установить локаль для каждого потока, а не глобально.