首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java尝试Catch Decorator

Java尝试Catch Decorator
EN

Stack Overflow用户
提问于 2018-09-22 07:58:17
回答 1查看 1K关注 0票数 0

我有一个有很多功能的类

代码语言:javascript
复制
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());
            }
        }
    }

在每个方法中,捕获特定类型的异常并将其转换为另一个异常并引发。

我想消除重复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-22 08:12:05

您可以使用lambda删除复制:

  • 如果您正在处理选中的异常,则CallableEx将接受任何异常。如果AException是一个未经检查的异常,您将不需要它。Callable接口不会对您有多大帮助,因为它抛出了一个Exception,而不是您的AException:例如,您必须检查等等。
  • 您可能可以编写主体而不是this::doSomething1,但我建议您不要这样做:这使代码更加清晰,并且分离了关注点。

您可能还可以使用注释处理器来完成相同的工作,并重写方法,以便将AException包装为BException。Java代码中不会有复制,但是字节码肯定会复制。

在这里,使用lambda的示例:

代码语言:javascript
复制
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();}

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52454687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档