Переопределите метод ожидания в интерфейсе Java

Я хотел бы использовать 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 с помощью jOOQ fluent API следующим образом:

Result 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 vs . длинные аргументы), я действительно могу это сделать. Но я боюсь, что это может запутать моих пользователей и привести к ошибкам. Так что это было бы неправильно:

                              .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. У вас есть лучшая идея для моего дизайна API, кроме простого переименования метода во что-то глупо, как doWait (int) или WAIT (int) ?

6
задан Lukas Eder 24 June 2011 в 11:05
поделиться