Когда использовать Enum или Collection в Java
В каких обстоятельствах перечисление более подходит, чем, например, коллекция, которая гарантирует уникальные элементы (разработчик java.util.Set, я думаю...)?
(Это похоже на предыдущий предыдущий question)
Ответы
Ответ 1
В основном, когда это четко определенный фиксированный набор значений, которые известны во время компиляции.
Вы можете использовать перечисление как набор очень легко (с EnumSet), и это позволяет вам определять поведение, ссылаться на элементы на имя, включить их и т.д.
Ответ 2
Когда элементы известны спереди и не будут меняться, перечисление будет подходящим.
Если элементы могут меняться во время выполнения, используйте Set.
Ответ 3
Я не джав-гуру, но я предполагаю использовать перечисление, если вы хотите гарантировать определенный пул значений, и использовать коллекцию, когда хотите сохранить уникальность. Пример будет состоять в том, чтобы перечислять дни недели (возможно, есть "funday" ) и иметь коллекцию SSN (общий пример, который я знаю!)
Ответ 4
Примечание: вы можете иметь оба с EnumSet.
Ответ 5
Отличные ответы - я попытаюсь обобщить, если только для моей собственной ссылки - похоже, вы должны использовать перечисления в двух ситуациях:
Все значения, которые вам нужны, известны во время компиляции и одно или оба из следующих:
- вам нужна более высокая производительность, чем обычные реализации коллекции.
- вы хотите ограничить потенциальные значения теми, которые указаны во время компиляции
С сборкой по ссылкам перечисления, которые дал Джон, вы можете получить преимущества производительности и безопасности перечисления как деталь реализации, не включив их в свой общий дизайн.
Сообщество wiki'd, пожалуйста, отредактируйте и улучшите, если хотите!
Ответ 6
В некоторых ситуациях ваш бизнес требует создания новых элементов, но в то же время бизнес-логики, основанные на некоторых фиксированных элементах. Для фиксированных вы хотите перечислить, новые, очевидно, требуют какой-то коллекции /db.
Я видел проекты, использующие коллекцию для таких элементов, в результате чего бизнес-логика зависела от данных, которые могут быть удалены пользователем. Никогда не делайте этого, но создайте отдельное перечисление для фиксированных и коллекцию для остальных, как требуется.
Другим решением является использование коллекции с неизменяемыми объектами для фиксированных значений. Эти элементы также могут находиться в db, но имеют дополнительный флаг, поэтому пользователи не могут обновлять/удалять его.