我需要为国家和州创建枚举。
创建和关联这些枚举的最合适方法是什么(在国家/地区X中可以有P,Q,R等状态)?
如果我有一个使用国家类型参数化的泛型类,我是否可以声明一个接受仅适用于特定国家/地区的状态的方法?
例如:
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();
}
}
答案 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部分,“否” - 无法将特定类的实例限制为子集。
如果您为每个国家/地区定义了一个单独的类,并为其所拥有的州定义了单独的枚举,那么您可以这样做。但这似乎不是一个好主意。