0

データベースとの対話を担当する Java クラスと、それに同時にアクセスするいくつかのオブジェクトがあります。

そのため、どの時点でも、データベース関連の操作が 1 つだけ実行されるようにする必要があります。

次のインターフェースを実装するクラスでこれらの操作を実装する予定です。

public interface IPersistenceAction<T> {
    T run(final IPersistenceState aPersistenceState);
}

IPersistenceStatejava.sql.Connectionおよびへの参照が含まれていますjava.sql.Statement:

public interface IPersistenceState {

    void setStatement(final Statement aStatement);

    Statement getStatement();

    void setConnection(final Connection aConnection);

    Connection getConnection();

}

IPersistenceインターフェイスを実装するクラスは、

  1. 接続が利用可能になるまで待ちます (つまり、誰もそれを使用しなくなります)。
  2. データベース関連の操作の特定のセットを実行し、
  3. 操作の結果を返します。

すべてのデータベース関連の操作は異なるタイプの結果を返す可能性があるため、そのタイプを指定する必要があることに注意してTくださいIPersistenceAction<T>

Javaで説明された同じこと:

public class Persistence implements IPersistence {
    private IPersistenceState state; // Contains connection and statement
    private boolean busy = false; // Indicates whether someone uses the object at the moment

    public T runAction(IPersistenceAction<T> action)
    {
        T returnValue = null;

        waitUntilIdle();
        synchronized (this) {
            busy = true;

            returnValue = action.run(state);

            busy = false;

            notifyAll();
        }

        return returnValue;
    }
    ...
}

これは Java 構文に違反しています。

しかし、Java 7 以降、Java 言語仕様にはクロージャがあります。

それらを使用して、異なる結果(異なるs)を持つデータベース操作のスレッドセーフ実行のタスクを解決できますか?T

はいの場合、例を挙げていただけますか?

4

1 に答える 1

1

メソッドにジェネリック型パラメーターを追加できます。

public <T> T runAction(IPersistenceAction<T> action);

<T>T が型パラメーターであり、 Type 自体ではないことをコンパイラーに示します。

于 2013-07-11T08:18:17.697 に答える