最初のケースで状態パターンは無理解状態のパターン
public static void main(String[] args) {
Context context = new Context();
context.setState(new State1());
for (int i = 0; i < 10; i++)
context.someMethod();
}
static class Context {
State state;
void setState(State state) {
this.state = state;
}
void someMethod() {
state.someMethod();
if (state instanceof State1) {
state = new State2();
} else {
state = new State1();
}
}
}
static interface State {
void someMethod();
}
static class State1 implements State {
@Override
public void someMethod() {
System.out.println("StateA.SomeMethod");
}
}
static class State2 implements State {
@Override
public void someMethod() {
System.out.println("StateB.SomeMethod");
}
}
public static void main(String[] args) {
Context c = new Context();
for (int i = 0; i < 10; i++)
c.someMethod();
}
static class Context {
public static final int STATE_A = 0;
public static final int STATE_B = 1;
private int state = STATE_A;
public void someMethod() {
switch (state) {
case STATE_A:
System.out.println("StateA.SomeMethod");
state = STATE_B;
break;
case STATE_B:
System.out.println("StateB.SomeMethod");
state = STATE_A;
break;
default:
break;
}
}
}
状態パターンがなければ、私たちは、1つのオブジェクトのみを持っているが、我々はsomeMethod()
メソッドを呼び出すときに別で、私たちは毎回新しいオブジェクトを作成します。
- これはパターンを正しく理解していますか?
- 非常に多くのオブジェクトを作成しないようにこの問題を解決するにはどうすればよいですか?
- このパターンについてさらに知りたいことがありますか?
最初の例には2つの状態しかありません。より大きな例では、 'someMethod()'は非常に扱いにくくなります。小さな、短命のオブジェクトを作成することについてあまり心配しないでください。ガベージコレクタはこれらをうまく処理します。オブジェクトの作成が問題になる場合は、すべての状態クラスのインスタンスをマップまたはリストに保持するか、目的のために(en) 'enum'を使用します。 – Barend
ご返信ありがとうございます。 – drifter