关联枚举和在泛型中使用

时间:2012-12-20 12:16:35

标签: java generics enums

我需要为国家和州创建枚举。

  1. 创建和关联这些枚举的最合适方法是什么(在国家/地区X中可以有P,Q,R等状态)?

  2. 如果我有一个使用国家类型参数化的泛型类,我是否可以声明一个接受仅适用于特定国家/地区的状态的方法?

  3. 例如:

    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();
        }
    }
    

2 个答案:

答案 0 :(得分:1)

你可以使枚举实现这样的界面:

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

除了实现接口enum之外,还不支持继承,但如果您希望在enum中拥有通用功能,则可以总是编写一些策略对象进入他们。

答案 1 :(得分: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部分,“否” - 无法将特定类的实例限制为子集。

如果您为每个国家/地区定义了一个单独的类,并为其所拥有的州定义了单独的枚举,那么您可以这样做。但这似乎不是一个好主意。