Javaでの機能を構成しますか?
-
18-09-2019 - |
質問
私たちは作成したと私は私が広告nauseum上と上で、自分自身を繰り返してると同じ問題に実行し続ける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;
}
}
私はこれを一周すると考えられてきた唯一の方法はそれでのtry-catchロジックを運ぶ機能にMethod
を渡すなどのような別の関数にそれをすべてを包むことである約ます:
public BarObj MyFunc(Double..._input){
return compose("MyLogic",_input);
}
private BarObj MyLogic(Double..._input)
throws Exception{
//stuff
}
が、それは醜いとそれに定型の多くを運びます。 Javaでの機能を構成する簡単な方法はありますか?
解決
Javaでこれは非常に困難です。
ただし、をカプセル化のオブジェクトで操作することができます
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));
}
他のヒント
lambdaj してみてください。それは非常に軽くて読みやすい方法でJavaへのFPのビットを追加することができます。 あなたは何に非常によく似た例を見つけることができますに特にこの閉鎖wikiページあなたが達成しようとしている、
これは明らかにあなたの呼び出しですが、ほとんどのAPIのデモと私はあなたが一番上に持っている長い形式を好む使用しました。私は、コードの上に見えるの後、私は通常、コピー&ペースト、私はそれがそこからそれを修正するんだと思うようにAPIが動作することを確認します。 repetative作品の一部を非表示にフォーマットを変更すると、オブジェクト指向開発のために何をしたいのか、間違いなくあるが、私はこのちょっとデモコードは「クリーンコード神々は」:-)を理解するであろうものだと思います。
がありJavaでこれを行う方法はありませんが、それはあなたのために可能な場合グルーヴィー使用してみてください。あなたが同様のラッピングを持つことができ、他のオプションは、アスペクトを使用しています。参照 AspectJののます。
私は、これはJavaで行われている方法は、一つの方法を持っているインターフェースを作成することです学びました。あなたのコードでは、そのインターフェイスを実装するクラスを使用します。