0

我有一个负责与数据库交互的 Java 类,以及几个将同时访问它的对象。

所以,我必须确保在每个时间点,最多执行一个与数据库相关的操作。

我打算在实现以下接口的类中实现这些操作:

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

IPersistenceState包含对java.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. 返回操作的结果。

请注意,每个与数据库相关的操作都可能返回不同类型的结果,因此我们需要TIPersistenceAction<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 是类型参数而不是类型本身。

于 2013-07-11T08:18:17.697 回答