будет загрузка необходимого класса ресурсов в память, однако данные этого класса могут быть сохранены на диске. Таким образом, если нужный класс не будет найден, то к требуемому имени класса будет добавлено расширение '.properties' и будет предпринята попытка найти файл с данными на диске.
Следует помнить, что необходимо указывать полностью квалифицированное имя класса ресурсов, т.е. имя пакета, имя класса. Кроме того, класс ресурсов должен быть доступен в контексте его вызова (там, где вызывается getResourceBundle ), то есть не быть private и т.д.
Всегда должен создаваться базовый класс без суффиксов, т.е. если вы создаете ресурсы с именем MyResource, должен быть в наличии класс MyResource.class.
ResourceBundle хранит объекты в виде пар ключ/значение. Как уже отмечалось ранее, класс ResourceBundle абстрактный, поэтому при его наследовании необходимо переопределить методы:
Enumeration getKeys() protected Object handleGetObject(String key)
Первый метод должен возвращать список всех ключей, которые определены в ResourceBundle, второй должен возвращать объект, связанный с конкретным ключом.
Рассмотрим пример использования ResourceBundle:
public class MyResource extends ResourceBundle { private Hashtable res = null; public MyResource() { res = new Hashtable(); res.put('TestKey','English Variant'); } public Enumeration getKeys() { return res.keys(); } protected Object handleGetObject(String key) throws java.util.MissingResourceException { return res.get(key); } } public class MyResource_ru_RU extends ResourceBundle { private Hashtable res = null; public MyResource_ru_RU() { res = new Hashtable(); res.put('TestKey','Русский вариант'); } public Enumeration getKeys() { return res.keys(); } protected Object handleGetObject(String key) throws java.util.MissingResourceException { return res.get(key); } } public class Test { public Test() { } public static void main(String[] args) { Test test = new Test(); ResourceBundle rb = ResourceBundle.getBundle('experiment.MyResource',Locale.getDefault()); System.out.println(rb.getString('TestKey')); rb = ResourceBundle.getBundle('experiment.MyResource', new Locale('ru','RU')); System.out.println(rb.getString('TestKey')); } } Пример 14.29.
Результатом будет:
English Variant Русский Вариант
Кроме того, следует обратить внимание, что ResourceBundle может хранить не только строковые значения. В нем можно хранить также двоичные данные, или просто методы, реализующие нужную функциональность, в зависимости от локали.
public interface Behavior { public String getBehavior(); public String getCapital(); } public class EnglishBehavior implements Behavior{ public EnglishBehavior() { } public String getBehavior(){ return 'English behavior'; } public String getCapital(){ return 'London'; } } public class RussianBehavior implements Behavior { public RussianBehavior() { } public String getBehavior(){ return 'Русский вариант поведения'; } public String getCapital(){ return 'Москва'; } } public class MyResourceBundle_ru_RU extends ResourceBundle {