【问题标题】:Mutually exclusive Enum controlled by a EnumSet由 EnumSet 控制的互斥 Enum
【发布时间】:2015-03-20 03:52:35
【问题描述】:
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

有没有办法让它变得更容易?谢谢!

【问题讨论】:

  • 那么这个枚举的所有元素都是独占的吗?您是否正在寻找不能包含多个元素的 EnumSet
  • 这就是所谓的“枚举的单个实例”:-)
  • 是否每个TagEnum 都有一个互斥的TagEnum
  • 这听起来像是一个架构问题——你真的需要 2 个枚举:一个用于年龄,一个用于性别。这自然会增强您对排他性的需求。
  • 您只需将复杂性转移到您的EnumSet 中。与围绕枚举组合的一组特殊规则相比,多个重载将更容易维护。我会选择重载。

标签: java enumset


【解决方案1】:

不,没有。 EnumSet 和更一般的 Set 不是正确的数据结构。

你为什么首先需要Set?如果您想要的只是相互排他性,那么对 TagEnum 的单个引用就足够了。

【讨论】:

  • 对不起,并非所有这些都是独家的。我已经更新了问题。
【解决方案2】:

EnumSet 不是不可变的Set,它确实有像addremove 这样的方法。初始化后它有多个Enum 值。你可以addremove 其他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");
}

希望这些对您有所帮助。

【讨论】:

  • EnumSet 不是不可变的Set,它确实有addremove 之类的方法。
  • @MattBall@Anderson 检查here
  • @SilentKnight 我们不会读普通话。这是Javadoc in English。 EnumSet 实现了Set,所以它当然有方法addremoveSet 的任何实现都需要它们。
  • @Anderson @ErwinBolwidt 哈哈哈,看到我提供了一个链接到中文网页的Url,我感到很抱歉。你说得对,我想我错过了Methods inherited from interface java.util.Set
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2018-05-23
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多