Я хотел бы использовать 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. Поэтому я хотел бы иметь возможность смоделировать вышеупомянутое предложение SQL с помощью свободно распространяемого API jOOQ следующим образом:
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 и выполнения оператора SQL для базы данных Oracle (или любой другой). Выше может быть юридически указано в интерфейсе:
/**
* 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;
// [...]
}
Благодаря перегрузке метода (int
против long
аргументов) я действительно могу это сделать. Но я боюсь, что это может запутать моих пользователей и привести к ошибкам. Так что это было бы неправильно:
.forUpdate()
.of(FIRST_NAME, LAST_NAME)
.wait((long) 5) // This doesn't make sense
.fetch(); // This doesn't compile
Итак, мои вопросы:
- Можно ли как-то запретить вызов / доступ к
Object.wait(long)
altoghether? Я так не думаю, потому что он объявлен final
, но, может быть, кто-то знает хитрость компилятора или что-то еще?
- У вас есть лучшая идея для разработки моего API, кроме простого переименования метода в нечто глупое, например
doWait(int)
или WAIT(int)
?