Взаимоисключающий 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");
}
Надеюсь, это поможет вам.