gpt4 book ai didi

java - 在 Java 接口(interface)中重新定义等待方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:54:04 24 4
gpt4 key购买 nike

我想使用 wait(int) 作为流畅 API 中方法的签名(用于 http://www.jooq.org )。目标是能够像这个例子一样构建 SQL 查询:

SELECT * FROM T_AUTHOR
WHERE ROWNUM <= 1
FOR UPDATE OF FIRST_NAME, LAST_NAME
WAIT 5

完整的 FOR UPDATE 子句语法规范(至少对于 Oracle)可以在这里看到:

FOR UPDATE [ OF [ [ schema. ] { table | view } . ] column
[, [ [ schema. ] { table | view } . ] column]...]
[ { NOWAIT | WAIT integer | SKIP LOCKED } ]

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/img_text/for_update_clause.htm

使用 jOOQ,我真的很想接近 SQL 语法。所以我希望能够像这样使用 jOOQ fluent API 对上述 SQL 子句进行建模:

Result<Record> result = create.select()
.from(T_AUTHOR)
.limit(1)
.forUpdate()
.of(FIRST_NAME, LAST_NAME)
.wait(5) // Here's the issue
.fetch();

fetch 方法用于将 API 的底层对象呈现为 SQL,并针对 Oracle(或任何其他)数据库运行 SQL 语句。以上可以在接口(interface)中合法指定:

/**
* A type that models a "step" in the creation of a query using the fluent API
*/
public interface SelectForUpdateWaitStep extends SelectFinalStep {
// [...]

/**
* Add a "FOR UPDATE .. WAIT n" clause to the query
*/
SelectFinalStep wait(int seconds);

// [...]
}

不过,我对此有些怀疑,因为存在与另一种方法发生冲突的风险:

public class Object {
// [...]

public final native void wait(long timeout) throws InterruptedException;

// [...]
}

感谢方法重载(intlong 参数),我实际上可以做到这一点。但我担心它可能会混淆我的用户并导致错误。所以这是错误的:

                              .forUpdate()
.of(FIRST_NAME, LAST_NAME)
.wait((long) 5) // This doesn't make sense
.fetch(); // This doesn't compile

所以我的问题是:

  1. 我能以某种方式完全阻止调用/访问 Object.wait(long) 吗?我不这么认为,因为它被声明为 final 但也许有人知道编译器技巧或其他东西?
  2. 除了将方法重命名为 doWait(int)WAIT(int) 之类的愚蠢的东西之外,您对我的 API 设计有更好的想法吗?

最佳答案

您可以尝试使用 waitFor 方法,它指定等待的时间和“条件”。实现细节将被隐藏,但一种可能的实现是立即尝试您的操作并循环直到满足指定条件,并在尝试之间适当暂停。

这是我自己使用的 Condition 的示例界面(如您所见,它不需要很复杂):

public interface Condition {
public boolean met();
}

关于java - 在 Java 接口(interface)中重新定义等待方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6398790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com