Честно говоря, мне трудно понять код. Он полон static
, что, как правило, является плохим знаком в ОО-дизайне, и за ним непросто следовать дженерикам.
Разве что-то более простое не понравится и этой работе?
private static <T> T getter(Future<T> src) {
try { return src.get(); }
catch (InterruptedException e) { handle( "some text"); }
catch (ExecutionException e) { handle( e ) }
return null;
}
Вы можете реализовать столько базовых методов handle
, сколько необходимо в базовом классе (или в статическом служебном классе) и использовать их в блоке catch по мере необходимости. Методы будут выбираться на основе подписи, поэтому, если вы хотите напечатать текст, вы передаете строку, если вы хотите, чтобы трассировка стека передавала исключение (или оба). Что приводит к комбинациям:
handle( String msg )
handle( Exception e )
handle( Exception e, String msg )
В этом решении меньше if
, что также является хорошим признаком.
Но я, возможно, упустил момент, учитывая, что код, который вы опубликовали, является лишь выдержкой из всего кода.
Посмотрите иначе на этот вопрос, который также имеет отношение: Сменная стратегия обработки ошибок
EDIT
Если предложенное мной решение слишком просто для ваших нужд, есть два других способа:
public class AbstractGetter<From> implements Function<Future<? extends From>, From> {
private abstract handleInterrupt( Exception e );
private abstract handleExecution( Exception e );
private static <T> T getter(Future<T> src ) {
try { return src.get(); }
catch (InterruptedException e) { handleInterrupt(e) }
catch (ExecutionException e) { handleExecution(e) }
return null;
}
}
И вы реализуете конкретный класс X, который соответствует различным стратегиям обработки исключений. По сути это шаблон template .
Вы все еще можете использовать делегирование, но на более грубом уровне. Вместо предоставления отдельного обработчика вы предоставляете стратегию обработчика. Это своего рода разновидность паттерна стратегии .
public interface ErrorStrategy
{
public void handleInterrupt(Exception e);
public void handleExecution(Exception e);
}
public class Getter<From> implements Function<Future<? extends From>, From> {
ErrorStrategy handler = new DefaultErrorStrategy(). // default one
public Getter<From>()
{
}
public Getter<From>( ErrorStrategy h )
{
this.handler = h.
}
private static <T> T getter(Future<T> src ) {
try { return src.get(); }
catch (InterruptedException e) { handler.handleInterrupt(e) }
catch (ExecutionException e) { handler.handleExecution(e) }
return null;
}
}
Вы можете создать нужные вам стратегии обработки ошибок X.