Java Try Catch Decorator - PullRequest
       11

Java Try Catch Decorator

0 голосов
/ 22 сентября 2018

У меня есть класс со многими функциями

public class Test {
        public void a() {
            try {
                doSomething1();
            } catch (AException e) {
                throw new BException(e.getMessage(), e.getCause());
            }
        }

        public void b() {
            try {
                doSomething2();
            } catch (AException e) {
                throw new BException(e.getMessage(), e.getCause());
            }
        }
    }

В каждом методе исключение определенного типа перехватывается и преобразуется в другое исключение и выдается.

Я хочу удалить дублирование.

1 Ответ

0 голосов
/ 22 сентября 2018

Вы можете удалить дублирование с помощью лямбды:

  • 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();}

}
...