2013-01-17 76 views
1

可能重複:
Is it possible to extend Java Enums?可擴展的枚舉,而無需使用擴展

我有一個小問題,即我有一定數量值的枚舉。此枚舉用於系統的多個部分,並且在某些情況下需要包含更多的值。

由於在Java中不允許擴展枚舉我試圖想到一些替代方案,到目前爲止我的解決方案是創建一個接口,該接口包含一個枚舉,其中包含系統所有部分共有的值,然後創建一個空類來實現這個接口。

所以enum A implements I這樣我就可以使用A.COMMON_ENUM.ENUM_VALUE

現在我可以創建包含一個枚舉ADDITIONAL_ENUM系統的一些副部新enum B和它實現I。所以,現在我可以用這個:

B.COMMON_ENUM.ENUM_VALUE 

B.ADDITIONAL_ENUM.ADDED_ENUM_VALUE 

這是一個醜陋的解決方案? - 我的意思是,它的工作原理,但似乎只是 ...

----- UPDATE:-----

常見的枚舉是系統的「核心」部分(它可以有多個前端),並且每個前端的附加枚舉都不相同。所以要使用一個類比:可以說一個車輛枚舉有ENGINE,DOORS,然後在我的CAR前端,我需要添加「WHEELS」,並且在我的BOAT前端中我需要添加「PROPELLER」

代碼示例:

public interface EnumType {   // I 
    public enum Core { 
    VALUE1, 
    VALUE2, 
    VALUE3 
    } 
} 

public enum CommonEnum implements EnumType {  // A 

} 

public enum AdditionalEnumType implements EnumType {  // B 
    public enum Additional { 
    VALUEX, 
    VALUEY 
    } 
} 
+2

我不完全知道什麼是不同的部分是你的描述,你能告訴編譯樣本代碼([SSCCE(http://SSCCE.org)將是不錯)? –

+1

您在枚舉中存儲的常量是什麼?他們以某種方式相關嗎? –

+0

@DuncanJones:答案是*類似*,但問題是完全不同的(這個問題指出,不可能直接擴展enum)。 –

回答

1

您可能會爲此查看typesafe enum pattern的相關信息。介紹界面你沒事。所以你應該只依賴於你的API中的那個接口。如果該接口的實現是由枚舉或類完成的,那麼您的API用戶不應該擔心。

我看不出什麼壞事。

0

你可以創建一個類似於自己的類設計

public class A { 
    A() {} 
    public static final A A1 = new A(); 
    public static final A A2 = new A(); 
    @Override 
    public String toString() { 
     return getClass().getSimpleName(); 
    } 
} 

public class B extends A { 
    B() {} 
    public static final A A3 = new A(); 
} 
+0

這是類型安全的枚舉模式,即SpaceTrucker上面提到的.. –

4

我會使用一個類似的模式,以枚舉,但我不明白爲什麼你已經獲得了所有嵌套在你的。煤礦是這樣的:

interface SomeType { 
    String name(); 
} 

public enum CoreEnum implements SomeType { 
    VALUE1, 
    VALUE2; 
} 

public enum AdditionalEnum implements SomeType { 
    VALUE3, 
    VALUE4; 
}