2010-02-05 105 views
9

我正在爲我們創建的API編寫演示代碼,並且我一直在遇到同樣的問題,在那裏我重複自己,一遍又一遍的廣告噁心。我很痛苦地意識到Java計劃添加閉包,但我現在無法訪問它們。這裏是重複遍,我想只是框到它自己的小角落的地方:在Java中編寫函數?

public BarObj Foo(Double..._input){ 
    try{ 
     //things that vary per function 
     //but everything else... 
    } catch(NullException _null){ 
     m_Logger.error("Null error exception caught in Blah::Foo"); 

     return null; 
    } catch(Exception ex){ 
     m_Logger.error(ex.getMessage()); 

     return null; 
    } 
} 

關於我想到了去解決這個問題的唯一方法是通過傳遞Method成一個函數與它承載在try-catch邏輯,像這樣包裝這一切在其他功能:

public BarObj MyFunc(Double..._input){ 
    return compose("MyLogic",_input); 
} 

private BarObj MyLogic(Double..._input) 
    throws Exception{ 
    //stuff 
} 

,但它看起來醜陋,它承載了太多的樣板。有沒有更簡單的方法來編寫Java中的函數?

+0

我覺得有些提議Java中的閉包擴展看起來更醜陋。 – DerMike 2010-02-05 17:09:11

回答

8

在Java中這是非常困難的,因爲沒有對函數的第一類支持(不像clojure或scala等可能)。

但是,您可以封裝的操作對象:

interface Function<R, T> { 

    R call(T... input); 
} 

然後重構Foo爲:

static <R, T> R runFunction(Function<R, T> function, T ... input){ 
    try{ 
     return function.call(input); 
    } catch(NullPointerException _null){ 
     m_Logger.error("Null error exception caught in Blah::Foo"); 
     return null; 
    } catch(Exception ex){ 
     m_Logger.error(ex.getMessage()); 
     return null; 
    } 
} 

測試用例:

class SumDoubles implements Function<Double, Double> { 

    @Override 
    public Double call(Double... input) { 
     Double sum = 0.0; 

     for (Double d : input) { 
      sum += d; 
     } 

     return sum; 
    } 
} 

@Test 
public void sum() { 
    Double sum = runFunction(new SumDoubles(), 1.0, 2.0, 3.0); 
    assertThat(sum, is(6.0)); 
} 
+0

那麼你會建議這些在更大的'Foo'類中作爲私人類嗎?我認爲這是一個相當好的問題分離。順便說一句,我喜歡斯卡拉。 – wheaties 2010-02-05 14:51:37

2

嘗試lambdaj。它允許以相當輕便和可讀的方式向Java中添加一些FP。 特別是在這closure wiki page,你可以找到一個非常相似的例子,你試圖實現,

0

這顯然是你的電話,但對於我用過的大多數API演示,我更喜歡你有更長的格式最佳。在我查看代碼後,我通常會複製並粘貼以驗證API的工作方式,就像我認爲的那樣,然後從那裏修改它。改變格式來隱藏一些重複的部分肯定是你想爲OO開發做什麼,但我認爲這種演示代碼是'乾淨的代碼之神'會理解的:-)。

0

在java中沒有辦法做到這一點,但嘗試使用groovy,如果它是可能的你。另一種選擇你可以有類似的包裝使用方面。見aspectj

0

我在Java中學到了這樣做的方式,就是創建一個有一個方法的接口。在你的代碼中,你使用了實現這個接口的類。