2014-10-19 165 views
3

在Java中,有没有什么办法从现有的枚举中定义一个新的枚举?我想要以下功能。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 

现实生活中的例子是日期,工作日WEEKENDDAYS,LECTUREDAYS,PARTYDAYS等

+0

为什么?你想做什么? – 2014-10-19 23:50:49

+2

总之没有。每个枚举成员是一个独特的对象实例。你可以通过使用equals方法而不是== – BevynQ 2014-10-19 23:53:43

+0

@SotiriosDelimanolis一个真实的例子是DAYS,WEEKDAYS,WEEKENDDAYS,LECTUREDAYS等。 – RoboAlex 2014-10-19 23:55:19

回答

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 
    } 
    } 
} 

但是,如果你这样做,你建议立即进行删除d要小心你实际使用Enums的类型安全性,否则为什么不把所有值存储为整数?像这样的,每个Enum值都有其他含义的情况下,如果你有时想比较Enums之间,但通常要使用类型安全性,可能会很有用。在你的“DAYS,WEEKDAYS,WEEKENDDAYS,LECTUREDAYS”例子中,我会确保内部值是强类型的,比如Java8 java.time.DayOfWeek

+0

“value”是私有的,“main”(它属于哪个类)有什么不对? – Multisync 2014-10-20 00:43:36

+0

我不认为封闭类会增加太多,但为了清晰起见,我将其包含在内。私人成员是可访问的,因为他们是内部类的一部分,但我也会添加getter以使其更通用。 – korvus 2014-10-21 03:13:17

5

您无法扩展枚举,但从您的周/周末天的例子来看,您似乎可能需要以不同的方式思考它。如果我们有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) 

希望这会有所帮助。

+0

这样我就无法确保类型安全。假设我想要有以下方法,scheduleParty(PartyDays day,Time t);或scheduleLecs(LectureDays日,时间t),.... EnumSet技术不符合我的目的。 – RoboAlex 2014-10-20 20:42:43

+0

您当然可以将此约束作为在运行时检查的前提条件(违反时抛出InvalidArgumentException)。并非所有事情都可以(或应该)在编译时完成。也许在你的情况下,但是这取决于你。 – Rinke 2014-11-17 10:59:44

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 
} 

可以延长使用任何谓词,你需要区分组枚举值的成员根据您的业务规则的基本类型。