Подтвердить что ты не робот

Статические константы String VS enum в Java 5+

Я прочитал этот вопрос и ответы: Каков наилучший способ реализации констант в Java?

И придумал решение, что перечисление - лучший способ реализовать набор констант. Кроме того, я прочитал пример на веб-сайте Sun, как добавить поведение в перечисление (см. Ссылку в упомянутом выше сообщении). Таким образом, нет никакой проблемы с добавлением конструктора со строковым ключом в перечисление для хранения связки значений String.

Единственная проблема заключается в том, что нам нужно добавить ".nameOfProperty", чтобы получить доступ к значению String. Поэтому везде в коде нам нужно обратиться к постоянному значению не только по имени (EnumName.MY_CONSTANT), но и так (Enum.MY_CONSTANT.propertyName).

Я здесь? Что вы думаете об этом?

4b9b3361

Ответ 1

Да, именование может показаться немного длиннее. Но не так много, как можно было себе представить.

  • Поскольку класс enum уже предоставляет некоторый контекст ( "Что такое набор констант, к которому это принадлежит?" ), имя экземпляра обычно короче, чем имя константы (сильная типизация уже отличен от аналогичных именованных экземпляров в других перечислениях).

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

  • В переключателя в перечислении вы не используете имя класса. (Переключатели даже не возможны в Strings pre Java 7.)

  • В самом классе перечисления используются короткие имена.

  • Поскольку перечисления имеют методы, многие низкоуровневые коды, которые могли бы сильно использовать константы, могли мигрировать из бизнес-кода в сам класс перечисления (либо динамический, либо статический метод). Как мы видели, переносимый код в enum уменьшает использование длинных имен еще больше.

  • Константы часто обрабатываются группами, такими как if, которые проверяют равенство с одной из шести констант или четырьмя другими и т.д. Перечисления оснащены EnumSets с помощью метода contains (или аналогично динамический метод, который возвращает соответствующую группу), которые позволяют относиться к группе как к группе (как второстепенное преимущество, обратите внимание, что эти две реализации группировки необычайно быстры - O (1) - и низкий по памяти!).

При всех этих моментах я узнал, что фактические коды намного короче!

Ответ 2

В отношении вопроса о константах - перечисления должны представлять константы, которые являются одинаковыми. Если вы выполняете произвольные константы, это неправильный путь, по причинам, описанным в этом другом вопросе.

Если все, что вы хотите, являются строковыми константами, то в отношении подробного кода вы правы. Однако вы можете переопределить метод toString(), чтобы вернуть имя свойства. Если все, что вы хотите сделать, - это связать String с другими строками, тогда это сэкономит вам дополнительную информацию в вашем коде.

Однако вы считали, что используете файлы свойств или некоторые другие способы интернационализации? Часто при определении dets из Strings это относится к сообщениям пользовательского интерфейса, и их извлечение в отдельный файл может сэкономить вам много будущей работы и значительно упростить перевод.