2017-09-25 126 views
2

例如:如何用相同的重複代碼塊來包圍不同的代碼塊?

public void foo(string something, Boolean flag, Object obj){ 
    try{ 
    if(flag){ 
     //some code 
    } 
} catch(Exception e) { 
    // handle exception 
} 
} 

public void doo(string something, Boolean flag){ 
    try{ 
    if(flag){ 
     //different code 
    } 
} catch(Exception e) { 
    // handle exception 
} 
} 

public void roo(string something, Boolean flag, Integer id){ 
    try{ 
    if(flag){ 
     //a bit of code 
    } 
} catch(Exception e) { 
    // handle exception 
} 
} 

我的問題是,有沒有辦法不具有在每個功能(例如在try-catch塊和IFS)的所有重複的代碼?這真的會清理我的項目,並會幫助我專注於重要的代碼。

+0

你可能想在這裏研究一些方面。本質上是在建議之前,之後或周圍修飾任何給定的方法調用,以便重複的超出範圍的代碼不會妨礙。既然你使用的是Spring,那麼你很幸運,因爲有一個特定的Spring AOP庫。 – Mena

+0

是否在所有情況下處理異常? – Maroun

+0

因此,在你的例子中,你有所有相同的變量,在這種情況下,我不明白你爲什麼需要3種不同的方法,這是實際項目的方式嗎? – user2023608

回答

4

如何將Runnable傳遞給一個新的方法來捕獲異常呢?

public void foo(String something, Boolean flag, Object obj) { 
    runSafe(something, flag,() => /*some code capturing obj*/); 
} 

public void doo(String something, Boolean flag) { 
    runSafe(something, flag,() => /*different code*/); 
} 

public void roo(String something, Boolean flag, Integer id) { 
    runSafe(something, flag,() => /*some code capturing id*/); 
} 

private void runSafe(string something, Boolean flag, Runnable r) { 
    try { 
     if (flag) { 
      r.run(); 
     } 
    } catch(Exception e) { 
     // handle exception 
    } 
} 

但是,傳遞一個布爾表示是否執行代碼對我來說看起來是錯誤的。爲什麼不使用這些方法的空對象實現(無所事事)而不是傳遞false?

+0

'Runnable'不能拋出檢查異常。不知道是否檢查OP的異常... – slim

+0

@slim好的一點,在這種情況下,'Callable '可以用來替代或者更好地使用合適的特定用戶定義的功能接口來實現相同的想法。 – Joffrey

+0

如果函數foo/doo/roo不是void函數呢?運行我應該使用什麼? – Wolfyaskingstuff

0

你可以用try-catch包圍這個方法的調用。如果您需要每個異常的唯一響應,您可以創建一個擴展異常的對象,或者僅使用帶有字符串消息的異常構造函數。

相關問題