1

国と州の列挙型を作成する必要があります。

  1. これらの列挙型を作成して関連付ける最も適切な方法は何ですか?

  2. Country 型でパラメータ化されたジェネリック クラスがある場合、特定の国でのみ使用可能な State を受け入れるメソッドを宣言できますか?

たとえば、次のようなものです。

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

編集 1:メンテナンスを容易にするために、すべての国の数百の州を含む単一の State 列挙ではなく、国ごとに個別の State 列挙を使用することをお勧めします。コメントしてください。

編集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

To answer part 1, you can define two enums, one of which references the other, like this:

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

To answer part 2, "no" - there is no way to restrict instances of a particular class to a subset.

You could if you defined a separate class for each country and a separate enum for the states it has, but this doesn't seem like a good idea.

于 2012-12-20T12:34:38.107 に答える
1

次のように、列挙型にインターフェイスを実装させることができます。

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

インターフェイスの実装は別として、enum継承はまだサポートされていませんが、enums に共通の機能を持たせたい場合は、たとえばいくつかの戦略オブジェクトをそれらにいつでも構成できます。

于 2012-12-20T12:18:07.497 に答える