2011-03-02 45 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在上面所說的,將枚舉簡單地組合成另一個枚舉可能是最簡單的。

祝你好運!