2012-12-20 27 views
1

我需要爲國家和州創建枚舉。關聯枚舉和在泛型中使用

  1. 什麼是創建和關聯這些枚舉最合適的方式(如在國家X可以有狀態P,Q,R等)?

  2. 如果我有一個泛型類參數與一個國家的類型,我可以宣佈將接受只對特定國家一個國家的方法?

例如像:

public abstract class TestClass <T extends Country> { 
    public void addState(T.State state); 
    public List<T.State> getSelectedStates(); 
} 

編輯1:爲了易於維護,我寧願每個國家的獨立國家的枚舉,而不是一個國家的枚舉上百個所有國家的國家。請給出意見。

編輯2:我用以下解決方案解決了與此非常相似的問題。

解決方案:作爲@Bohemian建議,

interface Country { } 
interface State<T extends Country> { } 

public class Countries { 
    public static class USA implements Country { } 
    public static class India implements Country { } 
} 

enum UsaStateEnum implements State<Countries.USA> { 
    NY, MA, MD, CA 
} 

enum IndiaStateEnum implements State<Countries.India> { 
    DEL, BLR 
} 

class GenericClass<T extends Country> { 

    List<State<T>> states; 

    public void addState(State<T> state) { 
     if (states == null) { 
      states = new ArrayList<State<T>>(); 
     } 
     states.add(state); 
    } 

    public List<State<T>> getSelectedStates() { 
     return states; 
    } 
} 

public class NestedEnumTest { 
    public static void main(String[] args) { 
     GenericClass<Countries.USA> obj = new GenericClass<Countries.USA>(); 
     obj.addState(UsaStateEnum.MA); 
     // obj.addState(IndiaStateEnum.DEL); // NOT ALLOWED 

     List<State<Countries.USA>> states = obj.getSelectedStates(); 
    } 
} 

回答

1

要回答第1部分,您可以定義兩個枚舉,其中一個參考,另外,像這樣:

public enum State { 
    A, B, C, D, E 
} 

public enum Country { 
    USA(State.A, State.B), 
    UK(State.C, State.D); 

    private final List<State> states; 

    Country(State... states) { 
     this.states = Arrays.asList(states); 
    } 

    public List<State> getStates() { 
     return states; 
    } 
} 

要回答第2部分,「無」 - 有沒有辦法限制的情況下,特定的類到子集。

你可以,如果你定義爲每個國家和它的美國獨立枚舉單獨的一類,但是這似乎並不像一個好主意。

+0

非常感謝。能否請您確認下方,如果我的最後一次發言的理解(「你可以,如果你定義爲每一個單獨的類...」)是正確的? 枚舉CountryEnum實現國家{美國,印度} 枚舉UsaStateEnum實現國家{NY,MA} 枚舉IndiaStateEnum實現國家{DEL,BLR} 抽象類的TestClass { 公共void addState(U state); public List getSelectedStates(); } – Somu

+0

當我想到更多關於它的時候,我實際上更喜歡每個國家都有一個單獨的國家枚舉,而不是單一的國家枚舉與所有國家的數百個州。 – Somu

1

您可以枚舉實現這樣的接口:從實現接口enum■不要支持繼承不過也

public enum MyEnum implements MyInterface<MyType> { 
    // ... 
} 

除了如果你希望在你的enum中有共同的功能,你總是可以編寫一些策略 o投入他們。

+1

不知道這是否有幫助。 (不知道我是否理解這個問題)。 – Thilo

+0

是的,它對我來說也有點模糊和晦澀。 –

+1

「還沒有?」有計劃嗎? (尤其是看到它們已經擴展java.lang.Enum)。 – Thilo