2016-07-25 65 views
0

我执行Iterator并为了处理Exceptions我使用以下模式:实际工作在专用hasNextPriv()方法中完成,而hasNext()方法处理Exceptions。这样做的原因是因为我不想用try-catch块来抛弃hasNextPriv()处理异常的方法包装?

@Override 
public boolean hasNext() 
{ 
    try { 
     return hasNextPriv(); 
    } catch (XMLStreamException e) { 
     e.printStackTrace(); 
     try { 
      reader.close(); 
     } catch (XMLStreamException e1) { 
      e1.printStackTrace(); 
     } 
    } 
    return false; 
} 

问题:

  1. 有没有更好的方式来做到这一点?
  2. 什么将是私人方法hasNextPriv()的好名字?
+2

我想在iterator中评论可关闭的资源。通常这是一种糟糕的做法,因为迭代器可能无法完全消耗。看看相关的问题http://stackoverflow.com/questions/3257972/closing-a-java-utiliterator –

回答

1

处理异常的另一种方法是提取每个抛出异常的部分,并在一个小的纯函数中正确处理每个异常。然后构建组成这些功能的最终结果。

Optional<Resource> open() { 
    try{ 
     //... 
     return Optional.of(resource); 
    } catch { 
     //.... 
     return Optional.empty(); 
    } 
} 

Optional<Value> read(Resource resource) { 
    try{ 
     //... 
     return Optional.of(resource.value); 
    } catch { 
     //.... 
     return Optional.empty(); 
    } 
} 

boolean hasNext() { 
    open().flatMap(this::read).isPresent(); 
} 

无处不在,需要返回Optional。通常有像在Null Object Pattern


另一种模式是包装在对象的功能的执行产生要么导致或误差值的某些虚拟值。在图书馆javaslang它看起来像

return Try.of(this::hasNextPriv) 
    .recover(x -> Match(x).of(
     Case(instanceOf(Exception_1.class), /*handle exception*/), 
     Case(instanceOf(Exception_2.class), ...))) 
    .getOrElse(false); 

Try对象是类似于Java 8 Optional但不是控股现值或遗漏值Try包含成功或失败的价值。


关于命名为hasNextPriv你的情况有特定的数据结构域。也许你可以拿出更具体的名字,比如hasMoreNodesnotEmpty等。