2014-02-14 152 views
0

此問題與my previous question on SO about using interface with enums密切相關。基本上,我有一堆密切相關的枚舉,並且它們都實現了一個通用接口。如何擴展實現接口的枚舉的靜態方法?

的接口稱爲Sections和枚舉被稱爲SectionASectionB等我有有像List<Sections>Map<Sections, String>領域其他類。現在,來填充這些領域,我想有機會獲得valueOf(String),即我想可以這樣說

Map<Sections, String> sectionsMap = new HashMap<Sections, String>(); 
for (String s : someStringList) { 
    try { 
     sectionsMap.put(Sections.valueOf(s), someOtherFunctionReturningString(s)); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); // if s doesn't match any enum 
    } 
} 

我也有在枚舉SectionASectionB,等我自己的靜態方法(這是因爲這些枚舉都有一個java.util.regex.Pattern場,和我的靜態方法是基於模式匹配的valueOf(String)方法的推廣。)

所以,我的問題是這樣的:

我如何能留住訪問靜態這些枚舉的方法,同時也在界面層次上進行泛化?

我打開其他的設計決定(其實,我目前擺脫整個enum想法和創造實現Sections和擴展一個抽象類AbstractSection類),但我很好奇別人怎樣使他們的類似情況下的決策。我問過這個問題,希望外面有人比我頭腦中有更好的想法。

+0

接口枚舉似乎擊敗枚舉的目的,不是嗎? http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html。從Oracle文檔中,「枚舉類型是一種特殊的數據類型,它使變量成爲一組PREDEFINED CONSTANTS。」根據定義,接口不是常量。也許你真的不想要枚舉的實現接口,並應該重新訪問你的設計? – Matt

+0

事情是,我的枚舉是(以某種方式)預定義的常量。究竟如何?這是我在上一個問題中提供的一個冗長的細節(這個問題的第一行鏈接到它)。 –

+0

如果我理解正確,你想有一個方法,可以採取一個字符串,可能是你的枚舉之一(哪一個?)的一部分,並從適當的枚舉中返回一個值。它發現枚舉和值的方式部分基於正則表達式? –

回答

0

您不能覆蓋靜態方法。 子類可以命名與超類相同的靜態方法,但super是非靜態運算符。 你可以有多種方法執行兩種不同的功能,但他們需要不同的名稱。

+0

的確如此,但也與我的問題無關。 –