2016-07-25 55 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等。