1

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

  1. 创建和关联这些枚举的最合适方法是什么(因为在 X 国可以有状态 P、Q、R 等)?

  2. 如果我有一个使用 Country 类型参数化的泛型类,我可以声明一个方法来接受仅适用于特定国家的 State 吗?

例如:

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

2 回答 2

1

您可以使枚​​举实现如下接口:

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

除了实现接口enums 还不支持继承,但如果您希望在您enum的 s 中具有通用功能,您可以随时将例如一些策略对象组合到它们中。

于 2012-12-20T12:18:07.497 回答
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 部分,“不” - 没有办法将特定类的实例限制为子集。

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

于 2012-12-20T12:34:38.107 回答