2016-11-24 10 views
0

私は異なる動作を取得するために私が欲しいのインスタンスからメソッドを呼び出すと、私は属性の値によって定義されている2つの状態を持つクラス(例えばそれが偽の真の可能開始)Javaの永久スイッチ

を持っています状態によって異なります。 私は現在、メソッドが呼び出されるたびに状態を照会するifステートメントを使用していますが、これを行うためのより速い方法があると思われます(ポリモーフィズムのようなものかもしれません)。

優雅な方法はありますかこれを実装するには?

public class StateChangingClass { 
private boolean started; 

public StateChangingClass() { 
    started = false; 
} 

public void start(){started = true;} 
public void end(){started = false;} 

public boolean checkCondition(double time) { 
    if (started) { 
     if (time>0) {return true;} 
     else {return false;} 
     } 

    else {return false;} 
    } 
(私の実際の問題は、はるかに時間がかかるので、改善の必要性である)私は、とき振る舞いの変更、それらをinherinting鋳造2つのサブクラスを有していると考えられてきましたが、おそらくより良い何か

以下のダミーの例があります

}

+2

あなたのサンプルコードは非常に単純すぎます。実際の問題は何ですか、コードで問題を示してください。 – luk2302

+2

「私はこれを行うより速い方法があると思う」これは遅くなることを強く疑う。 'return started && time> 0;'は非常に簡単に評価できます。 –

+0

私は実際のコードではないかのように感じますが、実際のコードの適切なシミュレーションはまだ良くなっていました。これは三項を使っても解決できます。 – Mritunjay

答えて

2

この例ではあまりにも多すぎますが、あなたの状況でどのように使用できるかを知ることができます。私は2つの実装を持つインターフェース 'ConditionChecker'を追加しました。メソッド 'start'と 'end'は必要なConditionCheckerを設定するだけです。

public class StateChangingClass { 

    private ConditionChecker conditionChecker; 

    public StateChangingClass() { 
    conditionChecker = StartedChecker.INSTANCE; 
    } 

    public void start() { 
    conditionChecker = StartedChecker.INSTANCE; 
    } 

    public void end() { 
    conditionChecker = EndChecker.INSTANCE; 
    } 

    public boolean checkCondition(double time) { 
    return conditionChecker.check(time); 
    } 

    interface ConditionChecker { 

    boolean check(double time); 
    } 

    static class StartedChecker implements ConditionChecker { 

    public static final ConditionChecker INSTANCE = new StartedChecker(); 

    @Override 
    public boolean check(double time) { 
     return (time > 0); 
    } 
    } 

    static class EndChecker implements ConditionChecker { 

    public static final ConditionChecker INSTANCE = new EndChecker(); 

    @Override 
    public boolean check(double time) { 
     return false; 
    } 
    } 
}