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