Качели I18N: когда загружать свойства? - PullRequest
4 голосов
/ 07 июля 2010

Я выполняю рефакторинг существующего настольного Java-приложения для загрузки интернационализированных текстовых меток пользовательского интерфейса из файла .properties. Когда в жизненном цикле приложения уместно загрузить файл свойств и заполнить строки в памяти? Существующая реализация определяет метку каждого компонента следующим образом: public static final String foo = "bar"; Кажется неэффективным загружать текст в конструкторе (так как он будет распределен между всеми экземплярами), но выполнение всего в блоке static {...} не кажется удаленно нормальным или. Какая лучшая практика здесь?

Ответы [ 4 ]

6 голосов
/ 07 июля 2010

В большинстве приложений, которые я видел, свойства загружаются из файла перед началом создания основного интерфейса. Эти свойства загружаются в ResourceBundle , который будет либо

  • статические
  • передается в качестве аргумента каждому конструктору
3 голосов
/ 08 июля 2010

Другой способ сделать это, без изменения кода панелей , - это использовать какое-то « внедрение ресурсов ».

Следующие библиотеки выполняют это, среди прочего:

  • Предохранитель : делает это (но я никогда не проверял это, и проект кажется мертвым)
  • Swing Application Framework : делает много вещей, включая внедрение ресурсов. Возможно, стоит проверить исходный код, чтобы выяснить, что для вас актуально. Обратите внимание, что проект также мертв, а исходный код довольно грязный (возможно, нелегко извлечь соответствующий код)
  • Guts-GUI : это полная структура GUI, включая внедрение ресурсов, но она основана на Guice. Если вы немного знакомы с Guice, то исходный код для внедрения ресурсов должен быть прост для понимания и извлечен из проекта.

В большинстве случаев внедрение ресурсов основывается на имени , которое присваивается каждому компоненту (именно так работают Swing App Framework и Guts-GUI, для Fuse я не уверен). Если компоненты не имеют правильного имени, у вас также есть несколько вариантов автоматического именования их (без изменения исходного кода панелей). Я реализовал такой подход в пакете Guts-GUI, вы также можете взглянуть на него.

Тогда внедрение ресурсов обычно вызывается непосредственно перед отображением вашего фрейма или диалога (это будет единственное местоположение кода, которое необходимо изменить в вашем текущем источнике, легко, если код для открытия диалогов / фреймов был централизован в одном классе и размазать)

2 голосов
/ 01 сентября 2010

Я бы выбрал ленивую загрузку. Когда вы загружаете все заранее, вы просто увеличиваете время запуска приложения и даже рискуете загрузить вещи, которые даже не нужны (больше).

Кстати, эта статичная вещь, о которой вы упомянули, в любом случае фактически приведет к отложенной загрузке, поскольку JVM выполняет отложенную загрузку для классов. Также: когда вы используете ResourceBundles, имейте в виду, что они выполняют некоторое внутреннее кэширование, поэтому определяя

public static final String labelText= "hello world";

или, что еще хуже, инициализация его из пакета ресурсов довольно бессмысленна.

Подробнее читайте:

Метод обработки I18N в Java

2 голосов
/ 07 июля 2010

Я бы предложил загружать ресурсы лениво .По сути, создайте функцию для получения пакета ресурсов, который загружает его, если его еще нет.Чем использовать его для извлечения ваших ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...