Я знаю, что это старый вопрос, но в интересах других:
Вы можете использовать анонимный внутренний класс, который реализует интерфейс для выполнения работы, аналогично тому, как работают механизмы сортировки Java Comparator и List. Это позволяет обрабатывать внутренний класс так, как если бы он был областью выполнения.
например. Изменение вашего исходного примера:
class Transaction
{
boolean i_am_in_a_transaction=false;
interface AutoRollback
{
void runQueries() throws Throwable;
}
void startTransaction() {
i_am_in_a_transaction=true;
...start Transaction...
}
void commit() {
i_am_in_a_transaction=false;
...commit Transaction...
}
void rollback() {
i_am_in_a_transaction=false;
...rollback Transaction...
}
public void execute(AutoRollback work)
{
try {
work.runQueries();
} catch ( Throwable t ) {
rollback();
throw t;
}
}
}
А затем пример того, как его использовать:
void test() throws WhateverException
{
Transaction my_transaction;
my_transaction.startTransaction();
my_transaction.execute( new AutoRollback() { public void runQueries() throws Throwable {
... perform your queries: can be more than one, complex code, etc. ...
... local variables from the enclosing scope can be used as long as they are final...
}});
my_transaction.commit();
}
Если у вас есть Java 8, это становится намного красивее с лямбдами, так как сохраняет синтаксис new AutoRollback
.
Если у вас нет Java 8, а лишняя пунктуация по-прежнему вас беспокоит, вы должны иметь возможность использовать процессор аннотаций и внедрение кода, чтобы сделать его читаемым. Аннотация во время компиляции с цель, установленная в LOCAL_VARIABLE, - то, что вы хотите, затем примените ее к my_transaction
.
... При условии, что на вашем рабочем месте допустимы процессоры аннотаций, такие как apt или pre-процессоры, и вы хотите проделать такую большую работу для синтаксического сахара.