2011-03-02 47 views
6

我希望能够定义一个Enum类,它将包含另一个Enum以及它自己的值。例如,:Java Enum引用另一个枚举

public enum A { 
    A1, A2, A3; 
} 

public enum B{ 
    B1, B2, ...(somehow define references to all values in enum A) 
} 

使得包含在枚举乙任何值必须为定义initself(如B1,B2),或枚举A的任何值

谢谢,

+1

为什么你需要扩展一个枚举? – Woot4Moo

回答

5

使得BAB的联合?没有B延伸A,这是不可能的,这是在java中的not supported。进行的方式是创建一个enum其中包含的AB,例如组合的值,

enum C { 
    A1, A2, A3, B1, B2; 
} 
+0

(这就是'A'扩展'B'。) –

1

这样的?

enum A { 
    A1, A2; 
} 

enum B { 
    B1(null), 
    B2(null), 
    A1(A.A1), 
    A2(A.A2); 

    private final A aRef; 
    private final B(A aRef) { 
     this.aRef = aRef; 
    } 
} 
+0

谢谢你的回答。看起来似乎没有简单的方法去做我脑海中的事情。我选择使用计划Java类来模拟此类功能。 – MikeMY

1

最接近你可以得到的是让A和B实现一些共享接口。

enum A implements MyEnum{A1,A2} 
enum B implements MyEnum{B1,B2} 

MyEnum e = B.B1; 

此解决方案不会与switch语句和优化的枚举集合一起工作。

java的enum实现不支持你的用例,它要么实现起来比较复杂(相对于它的实用性),要么它没有出现(我知道的几种语言都不是直接支持这种语言的) 。

2

通常,由于我们在java中工作,并且通常禁止OO设计,所以您可以通过扩展来获得此功能。但是,枚举会隐式扩展java.lang.Enum,因此不能扩展另一个类。

这意味着枚举的可扩展性大部分来自不同的来源。

Joshua Bloch在有效Java:第二版在项目34中对此进行了补充,当时他提供了用于枚举的共享接口模式。这是他的模式的例子:

public interface Operation { 
     double apply(double x, double y); 
    } 

    public enum BasicOperation implements Operation { 
     PLUS("+") { 
      public double apply(double x, double y) { return x + y; } 
     }, 
     MINUS("-") { 
      public double apply(double x, double y) { return x - y; } 
     }, 
     TIMES("*") { 
      public double apply(double x, double y) { return x * y; } 
     }, 
     DIVIDE("/") { 
      public double apply(double x, double y) { return x/y; } 
    } 

这是关于尽可能接近共享状态,当涉及到枚举。正如JohanSjöberg在上面所说的,将枚举简单地组合成另一个枚举可能是最简单的。

祝你好运!