Вы можете удалить дублирование с помощью лямбды:
-
CallableEx
принимает любое исключение, если вы работаете с проверенным исключением.Вам бы это не понадобилось, если бы AException
было непроверенным исключением.* Интерфейс Callable
не очень вам поможет, потому что он выдает Exception
, а не ваш AException
: вам придется проверять, например, и т. Д. - Возможно, вы могли бы написать тело вместо
this::doSomething1
, но я советую против этого: это делает код более понятным и разделяет проблемы.
Возможно, вы также можете использовать процессор аннотаций, чтобы выполнить ту же работу и переписать метод, чтобы обернуть ваш AException
в BException
.У вас не будет дублирования в вашем Java-коде, но ваш байт-код наверняка будет.
Вот пример с lambda:
public class Test {
@FunctionalInterface
interface CallableEx<T, E extends Exception> {
T run() throws E;
}
private <T> void handleException(CallableEx<T, AException> forrestGump) {
try {
return forrestGump.run();
} catch (AException e) {
throw new BException(e.getMessage(), e.getCause());
}
}
public String a() {
return handleException(this::doSomething1);
}
public int b(int a, int b) {
return handleException(() -> this.doSomething2(a, b));
}
public <T extends Foobar> void c(T my) {
handleException(() -> this.doSomething3(my));
}
private String doSomething1() {return "A";}
private int doSomething2(int a, int b) {return a + b;}
private <T extends Foobar> void doSomething3(T my) {my.foo();}
}