在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等。
答案 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
}
现在,您可以使用您需要的任何谓词来扩展基础类型,以根据业务规则区分枚举值集的成员。