2009-10-21 60 views
3

我怎樣纔能有一個抽象的枚舉,或某種基地枚舉?如何包裝Java枚舉並仍然遍歷它?

在我的通用代碼中,我想枚舉佔位符MyItems的概念,而不將自己綁定到具體的枚舉。然後在我的每個項目中,我都會有一個具體的實現。

E.g. 共同守則

public interface MyItems { 
    // Marker interface 
} 

項目A

public enum Items implements MyItems { 
    RED_CAR, BLUE_CAR, GREEN_CAR; 
} 

項目B

public enum Items implements MyItems { 
    BROWN_TREE, GREEN_TREE; 
} 

這似乎是工作,但在我的通用代碼,我不能寫在我的接口枚舉循環,因爲它不是枚舉。在我的公共代碼我想寫

for (MyItems item : MyItems.values()) 
    doSomething(item); 

但我不能,因爲我的接口只是一個標記接口,並且它不具有.values()。

任何建議非常感謝。我不知道我是否完全錯誤地嘗試。

回答

8

這樣做確實沒什麼意義 - 因爲values()方法是靜態。要調用它,你需要知道你想要調用它的類型。

你能來最接近的將有:

public interface MyItemsFactory<T extends MyItems> 
{ 
    Iterable<T> values(); 
} 

,然後實現在一些通用的方法,例如

public class EnumFactory<T extends Enum<T> & MyItems> 
    implements MyItemsFactory<T> 
{ 
    private final Class<T> clazz; 

    public EnumFactory(Class<T> clazz) 
    { 
     this.clazz = clazz; 
    } 

    public Iterable<T> values() 
    { 
     return EnumSet.allOf(clazz); 
    } 
} 

但基本規則是多態和靜態方法不會混合。在您的來電:

for(MyItems item : MyItems.values()) 
    doSomething(item); 

實施MyItems你會希望它遍歷哪個?你可能有多種類型的實現MyItems

+0

感謝您的回答,我將學習並嘗試充分理解。要回答你的問題,我不認爲我很清楚。我的理想是能夠'注入'我想要使用的枚舉,這將在每個使用公共代碼的項目中改變。然後,我希望通用代碼能夠遍歷枚舉並執行一些操作。 – Pengin 2009-10-21 10:54:03

+0

如果它需要能夠遍歷它,並且你想多形地做到這一點,你需要注入的是我的答案中顯示的工廠。這將允許您適當地迭代值。 – 2009-10-21 10:56:47

1

你可以看看用Type Safe Enum Pattern代替enums,它可以讓你實現一個接口,並使用values()方法返回特定實現的所有值。