【问题标题】:Refactoring a method which returns false if an some exception is thrown重构如果抛出一些异常则返回 false 的方法
【发布时间】:2020-07-24 11:05:18
【问题描述】:

我有这个方法,它应该只在列表中的所有项目 (List<Foo> foos) 没有发生异常时返回 true:

public boolean isHealthy(){
    try{
        for(final Foo myFoo : foos){
           checkConnection(myfoo);
        }
    }
    catch(DataAccessException | SQLException ex){
         return false;
    }
    return true;
} 

checkConnection 是一个可以抛出异常的 void 方法

  void checkConnection(final Foo myFoo) throws SQLException{
      // ...
  }

我想重构 isHealthy 使其更具可读性,因为从 catch 块返回的结果看起来并不优雅,即使该方法只有 9 行,乍一看它对嵌套 try 的作用并不明显-for-catch 块。是否有一些 java 8 特性(可选、流 ..)可以帮助他?

【问题讨论】:

  • 我可能会将return true; 放在try 部分中,在for 循环之后。那么至少读者知道他/她必须更深入地寻找返回值。无论如何,您的方法已经符合我的编码风格。
  • @OleV.V.谢谢。

标签: java exception java-8 try-catch refactoring


【解决方案1】:

我会根据连接结果将每个 Foo 中包含在 try-catch 中的连接检查委托给返回 boolean 的单独方法:

boolean isConnected(final Foo myFoo) {
    try {
        checkConnection(myFoo);
        return true;
    } catch(DataAccessException | SQLException ex) {
        return false;
    }
}

void checkConnection(final Foo myFoo) throws SQLException {
    // ...
}

使用Stream::allMatch检查是否所有连接检查都是true,运行状况检查本身变得相当简单和可读。

public boolean isHealthy(){
    List<Foo> foos = ...
    return foos.stream().allMatch(this::isConnected);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多