9

私は自分たちが作成したAPIのデモコードを書いていますが、同じ問題が何度も何度も繰り返されています。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で関数を作成する簡単な方法はありますか?

4

5 に答える 5

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));
}
于 2010-02-05T14:47:52.350 に答える
2

lambdajを試してください。これにより、非常に軽量で読みやすい方法でJavaにFPを少し追加できます。特に、このクロージャwikiページでは、達成しようとしているものと非常によく似た例を見つけることができます。

于 2010-02-05T14:44:44.007 に答える
0

これは明らかにあなたの呼び出しですが、私が使用したほとんどのAPIデモでは、上部にある長い形式を好みます。コードを調べた後、通常はコピーアンドペーストを実行して、APIが思ったとおりに機能することを確認し、そこから変更します。繰り返しの一部を非表示にするようにフォーマットを変更することは、間違いなくOO開発でやりたいことですが、このようなデモコードは、「クリーンなコードの神々」が理解できるものだと思います:-)。

于 2010-02-05T14:46:40.263 に答える
0

Javaでこれを行う方法はありませんが、可能であればgroovyを使用してみてください。同様のラッピングを行うことができる他のオプションは、アスペクトを使用することです。アスペクトjを参照してください。

于 2010-02-05T14:47:27.263 に答える
0

これがJavaで行われる方法は、1つのメソッドを持つインターフェースを作成することであることを学びました。コードでは、そのインターフェイスを実装するクラスを使用します。

于 2010-02-05T14:47:33.927 に答える