Взаимоисключающий Enum, управляемый EnumSet

public enum TagEnum {
   MALE,FEMALE,//GENDER
   YOUNG,MIDDLE_AGED,OLD//AGE
}

Я хочу использовать TagEnum для описания человека. MALE и FEMALE являются взаимоисключающими, так же как и перечисления для возраста.

Например, если вы поместите MALE в EnumSet, FEMALE не будет принята.

Есть ли такой EnumSet?

== Обновление ==

Обратите внимание, что пол и возраст используются для описания человека. Что происходит, если у меня более 5 измерений? Сделать 5 перечислений и 5 отдельных ссылок?

Поскольку мне нужен тестовый метод, чтобы узнать, есть ли у кого-нибудь такое перечисление, излишне делать 5 перегруженных методов, таких как:

boolean test(Age age);
boolean test(Gender gender);
boolean test(OtherDimension other);
//What a pity Enum can't be inherited

Есть ли способ сделать это проще? Спасибо!

2 ответа

Нет, нет EnumSet, а также Set в более общем смысле, неправильная структура данных для этого.

Почему вы думаете, что вам нужно Set на первом месте? Если все, что вы хотите, это взаимная исключительность, единственная ссылка на TagEnum будет достаточно.

EnumSet не является неизменным Setи у него есть такие методы, как add а также remove, Имеет номера Enum значения после инициализации. И вы можете add или же remove Другой Enum значения того же типа с инициализацией. Кроме того, способ инициализации EnumSet это так:

EnumSet<TagEnum> all = EnumSet.allOf(TagEnum.class);
EnumSet<TagEnum> none = EnumSet.noneOf(TagEnum.class);
EnumSet<TagEnum> range = EnumSet.range(TagEnum.MALE, TagEnum.FEMALE);
EnumSet<TagEnum> some = EnumSet.of(TagEnum.YOUNG,TagEnum.OLD);

Между тем, вы можете обрабатывать EnumSet следующим образом:

for(TagEnum a : all){
    System.out.println(a);
}        
if(all.contains(TagEnum.MALE)){
    System.out.println("sure");
}

Надеюсь, это поможет вам.

Другие вопросы по тегам