EnumSet
Множество значений одного enum. Работает как набор битовых флагов, но с понятным кодом.
Доступно с: Java 5
Синтаксис
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>Примеры
Создание множеств фабричными методами:
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
void main() {
EnumSet<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
EnumSet<Day> workdays = EnumSet.complementOf(weekend);
IO.println(weekend);
IO.println(workdays);
IO.println(EnumSet.range(Day.TUE, Day.THU));
IO.println(workdays.contains(Day.FRI));
}Результат:
[SAT, SUN]
[MON, TUE, WED, THU, FRI]
[TUE, WED, THU]
trueПрава доступа как набор флагов:
enum Permission { READ, WRITE, DELETE }
void main() {
EnumSet<Permission> perms = EnumSet.noneOf(Permission.class);
perms.add(Permission.READ);
perms.add(Permission.WRITE);
IO.println(perms);
IO.println(perms.containsAll(EnumSet.of(Permission.READ, Permission.DELETE)));
IO.println(EnumSet.allOf(Permission.class));
}Результат:
[READ, WRITE]
false
[READ, WRITE, DELETE]Примечания
Объект создают не через new, а методами of(), noneOf(), allOf(), range(), complementOf(), copyOf(). Внутри — число long, где каждый бит означает одну константу, поэтому операции очень быстрые. Элементы всегда перебираются в порядке объявления. Множество изменяемое; для неизменяемого используйте Set.copyOf(enumSet) или Collections.unmodifiableSet().
См. также
- EnumMap — Словарь, ключи которого — значения одного enum. Быстрый и хранит ключи в порядке объявления.
- Enum.values() — Методы каждого enum: values() — все константы, valueOf() — константа по имени, ordinal() и name() — номер и имя.
- HashSet — Множество без повторов на основе хеш-таблицы; порядок не гарантирован.
- & | ^ ~ << >> >>> — Побитовые операторы: работают с отдельными битами целых чисел — И, ИЛИ, исключающее ИЛИ, НЕ и сдвиги.
Вопросы и ответы по теме
В учебнике
- Коллекции для перечислений — EnumMap и EnumSet в Java: словарь и множество для констант enum, диапазоны и дополнения, values(), valueOf() и почему нельзя полагаться на ordinal().