Java:新枚举,是旧枚举的子集

时间:2014-10-19 23:47:49

标签: java enums

在Java中,有没有办法从现有的枚举中定义新的枚举?我想要以下功能。

public enum A{1, 2, 3, 4, 5, 6, 7, 8, 9};
public enum B{1, 2, 3, 4};
public enum C{3, 4, 5, 6, 7};

1,2,3和所有必须相同,即

A.1 == B.1 = true
B.4 == C.4 = true

一个现实生活中的例子是DAYS,WEEKDAYS,WEEKENDDAYS,LECTUREDAYS,PARTYDAYS等。

3 个答案:

答案 0 :(得分:7)

你无法扩展枚举,但从你的周/周末日例来看,似乎你可能需要稍微考虑一下。如果我们有enum Days{ MON, TUE, WED, THU, FRI, SAT, SUN },请按以下方式考虑周/周末日期:

EnumSet<Days> weekDays    = EnumSet.range(Days.MON, Days.FRI);
EnumSet<Days> weekendDays = EnumSet.range(Days.SAT, Days.SUN);
EnumSet<Days> partyDays   = EnumSet.of( Days.TUE, Days.THU );

诸如“任何工作日也是派对日”之类的自然问题?然后可以按照您的预期表达:

!Collections.disjoint(weekDays, partyDays)

希望这有帮助。

答案 1 :(得分:1)

我认为你最好的选择是:

public class EnumTest
{
  public enum A {
    X1(1), X2(2), X3(3), X4(4), X5(5), X6(6), X7(7), X8(8), X9(9);

    private final int value;
    public int getValue() { return this.value; }
    A(int value) {
      this.value = value;
    }
  }
  public enum B {
    X1(1), X2(2), X3(3), X4(4);
    private final int value;
    public int getValue() { return this.value; }
    B(int value) {
      this.value = value;
    }
  }
  public enum C {
    X3(3), X4(4), X5(5), X6(6), X7(7);

    private final int value;
    public int getValue() { return this.value; }
    C(int value) {
      this.value = value;
    }
  }

  public static void main()
  {
    A a;
    a = A.X1;
    B b;
    b = B.X1;
    if (b.getValue()==a.getValue()) {
      // do something
    }
  }
}

但是,如果你这样做,你应该小心你实际上使用Enums的类型安全性,否则为什么不将所有值存储为整数?像这样的东西,如果你有时想要在Enums之间进行比较,但通常想要使用类型安全,那么每个Enum值具有一些其他含义可能是有用的。在你的'DAYS,WEEKDAYS,WEEKENDDAYS,LECTUREDAYS&#34;例如,我确保内部值是强类型的,例如Java8 java.time.DayOfWeek

答案 2 :(得分:1)

Java中的枚举类型提供了定义其他属性和方法的能力。

public enum DAY_INDICATOR {
  SUNDAY(1,true), MONDAY(2,false), TUESDAY(3,false), WEDNESDAY(4,false), THURSDAY(5,false), FRIDAY(6,false), SATURDAY(7,true)
  private final int dayNumber;
  private final bool weekendDay;
  public DAY_INDICATOR(int dn, bool wd) {
    dayNumber = dn;
    weekendDay = wd;
  }
  public bool isWeekendDay() {
    return weekendDay;
  }
  ... more accoutrements of an enumerated type
}

现在,您可以使用您需要的任何谓词来扩展基础类型,以根据业务规则区分枚举值集的成员。