0

私はこのようなクラスを持っています:

public class DatabaseSession {

  public makeCallOne() {...}
  public makeCallTwo() {...}
  public close() { ... }

}

ユーザーがこのクラスをインスタンス化した場合、makeCallOne と makeCallTwo を呼び出すことができると思います。ただし、close() を呼び出した場合、その後の makeCallOne() または makeCallTwo() の呼び出しは例外を返す必要があります。

各メソッドの先頭に if ステートメントを付けてこれを行うこともできますが、書き忘れがちです。「このオブジェクトは現在役に立たない。もう呼び出すことはできない」と言うために使用される標準的なメカニズムは何ですか?

4

4 に答える 4

2

所有者はそれを範囲外にさせます。これが標準のメカニズムです。次に、防御プログラミングとして、とにかくすべてのmakeCall関数内にifステートメントを記述します(哲学に応じて、代わりにアサーションを主張することができます)。

于 2013-03-20T20:03:19.773 に答える
2

Java クラス ライブラリには無効化呼び出しはありません。

State列挙型を作成し、防御的なプログラミングとしてすべてのメソッドの先頭でそれをチェックする必要があります。クラスは、特定の状態で特定のことを行う有限状態マシンになります。したがって、インスタンス化され、開かれ、閉じられるなどの可能性があります。この情報はState列挙型にエンコードできます。これは、柔軟性があり、今後の変更に対応できます。

例えば、

public class DatabaseSession {
    private State state;

    ...


    public makeCallOne() throws Exception {
        if (state == State.CLOSED)) {
            throw new Exception("Database Session has already been closed");
        }
        ...
    }
    public makeCallTwo() throws Exception {
        if (state == State.CLOSED)
            throw new Exception("Database Session has already been closed");
        }
        ...
    }

    public close() {
        state = State.CLOSED;
        ...
    }

    private enum State {
        OPEN;
        CLOSED;
    }

}

于 2013-03-20T20:07:07.447 に答える
2

私の知る限り、フラグを使用してのみそのようなことを行うことができますが、検証メソッドに if ステートメントを配置することはできます。そのようです:

public class DatabaseSession {

    private boolean closed = false;

    private void validateSession() {
        if(closed) {
            throw new ObjectInvalidException();
        } 
    }

    public void makeCallOne() { 
        validateSession();
        /*do something*/ 
    }
    public void makeCallTwo() { 
        validateSession();
        /*do something*/
    }

    public void close() {
        closed = true;
    }
}

私は独自の例外を定義します (extend Throwable)。

于 2013-03-20T20:11:37.777 に答える
0

オブジェクトの作成時にオン (true) になるインスタンス固有のフラグを使用し、そのオブジェクトで close メソッドが呼び出されたときにオフ (false) に設定できます。フラグの値をいつでも確認して、フラグがオフの場合は例外をスローできます (false に設定されている、つまり、オブジェクトの close メソッドが呼び出されたことを示します)。

お役に立てれば。

于 2013-03-20T20:06:14.040 に答える