Перечисления VS Классы VS Интерфейсы

Я читал много сообщений на этом сайте относительно использования констант.

Вопрос: Когда я должен использовать Enums для констант, vs используя классы или интерфейсы.

Я вижу две ключевые ситуации, которые я ищу.

1. Глобальные константы, используемые в приложениях несколькими проектами.

Пример:

  • Общие строки ведения журнала
  • Контейнерные ссылки, такие как ссылка на сопоставление базы данных, используемая в       WebSphere EAR

2. Конкретные константы объекта

Пример:

  • Ставки оплаты труда для объекта сотрудника

Из всего, что я прочитал, это то, что я думаю, что понимаю и что я ищу.

Для ситуации 1: Подход к дизайну: используйте конечный класс и статический импорт.
Видел здесь: Что такое интерфейсные константы?

Для ситуации 2: Подход к дизайну. Применяйте использование Enums для представления этих констант в качестве объекта.

Дополнительные пункты для запоминания:

  • Если константная строка принадлежит классу, и вам нужно только строковое значение сохранить в классе, который использует его
  • Не используйте интерфейс для ситуации 1. Как упоминается в ссылке выше как Anti-Pattern. ,

Заранее благодарим за мысли и мнения.

Ответы

Ответ 1

Глобальные константы, как вы выразились, должны быть в файле свойств, так как каждое приложение может индивидуально настраивать их без модификации кода. Для объектных конкретных констант мое общее правило на Enum по сравнению с static final я обычно склоняюсь к тому, сколько элементов необходимо иметь и как связаны эти элементы. Если между ними существует большая связь, например Suits в колоде Cards, я бы пошел на перечисление. Если для пользователя задан возраст по умолчанию, тогда это становится окончательным, поскольку нет цели сделать его переименованием, поскольку во многих областях ему не нужно ссылаться. Это лишь некоторые мысли по каждому из способов, с которыми я подходил.

Ответ 2

  • Глобальные константы, используемые различными проектами: Enum
    Лучше использовать Enum над public static final членами класса. Я думаю, более чистый и понятный.

  • Объектно-ориентированные константы: public static final members in Class. Потому что они необходимы только в пределах области действия объекта, тогда нет необходимости создавать для него новый Enum.

Nice читать

Обновление (исправлена ​​неработающая ссылка):

Ответ 3

Похоже, что почти все, что вы указали для чисел 1 и 2, относится к файлам конфигурации или таблицам баз данных.

Вы хотите перекомпилировать код, когда ваш сотрудник получит рейз или изменится имя страницы?

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

Объем этих перечислений, однако, специфичен для приложения. Если перечисление используется только классом, это должно быть частное перечисление. Если он разделяется несколькими классами, то он должен быть в собственном файле определения класса.