を変更する際に、追加のコンテンツを持っているための適切な方法は何である私は、このようなクラスを持っている:状態
public class Machine {
enum State {
STARTED, STOPPED
}
private State state;
private String whyIsItStopped; // only used in STOPPED state
...
}
私はこれを行うための適切な方法であるのだろうか。私はこれともっと複雑なクラスの方法を持っており、私がこれを行うと混乱するようです。
私のアーキテクチャに問題があります。何かアドバイスをいただけますか? /ステートパターンが同じメソッドの動作を変更するには良いようだが、それはadditionnalフィールドに奇妙である
public interface State {
public String whyIsItStopped();
public class Started implements State {
@Override
public String whyIsItStopped() {
return null;
}
}
public class Stopped implements State {
private final String reason;
public Stopped(String reason) {
this.reason = reason;
}
@Override
public String whyIsItStopped() {
return reason;
}
}
}
public class Machine {
private State state = new State.Started();
public String whyIsItStopped(){
state.whyIsItStopped();
}
// setState etc ...
}
:私のようなほぼ溶液で到着した状態パターンを使用して
UPDATE
データ。
問題は、実際には同じオブジェクトではなく、多形性は本当に有用ではないということです。私はマシンが(instanceofはの方法として)そのコンテンツを取得する前に停止されたかどうかをテストする必要が
if (machine.isStopped()){
println(machine.whyIsItStopped());
}
もう一つの方法は、唯一の停止状態
public interface State {
public class Started implements State {}
public class Stopped implements State {
private final String reason;
public String whyIsItStopped() {
return reason;
}
}
}
にゲッターを設定することが可能であり、メッセージを取得する:
if (machine.isStopped()){
println(((State.Stopped)machine.getState()).whyIsItStopped());
}
// Yeah that's not really beautiful
どちらかが古くなっているか、使用率が異常です。
他の解決方法がありますか?
アンデレスの答えが上です。多態性を使用して**状態マシン**を実装する - 抽象ベース。州固有のサブクラスが含まれます。あなたは手動でこの方法であなたのfsmを「ハードコードしない」** **です。 – GhostCat
各クラスの特定のメソッドではなく、パターンに記述されているhandleメソッドを使用します。 – Andres