Статические строковые константы VS перечисление в Java 5+ - PullRequest
24 голосов
/ 07 декабря 2009

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

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

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

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

Ответы [ 2 ]

25 голосов
/ 07 декабря 2009

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

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

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

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

  4. В самом классе enum вы используете короткие имена.

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

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

Со всеми этими пунктами Я обнаружил, что реальные коды намного короче !

7 голосов
/ 07 декабря 2009

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

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

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

...