Frage

Ich schreibe Demo-Code für eine API die wir erstellt haben und ich in das gleiche Problem weiterlaufen, wo ich mich wiederhole, immer und immer wieder bis zum Überdruss. Ich bin schmerzlich bewusst, dass Java geplant Schließungen hinzugefügt haben, aber ich habe keinen Zugriff auf sie jetzt. Hier ist, was alle über den Ort wiederholt, dass Ich mag würde nur in seine eigene kleine Ecke Box:

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;
    }
}

über die einzige Art, wie ich gedacht habe, um diesen zu gehen, ist durch eine Method in eine Funktion übergeben, die mit ihm trägt die Try-Catch-Logik und Verpackung alles in einer anderen Funktion auf wie folgt:

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

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

, aber es sieht hässlich aus und trägt mit ihm eine Menge vorformulierten. Gibt es einen einfacheren Weg, Funktionen in Java zu schreiben?

War es hilfreich?

Lösung

in Java ist dies sehr schwierig, da es keine erstklassige Unterstützung für Funktionen (im Gegensatz zu clojure oder scala und wahrscheinlich noch andere).

Sie können jedoch encapsulate die Operation in einem Objekt:

interface Function<R, T> {

     R call(T... input);
}

dann Refactoring Foo wie:

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;
    }
}

Testfall:

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));
}

Andere Tipps

Versuchen Sie lambdaj . Es ermöglicht in eine ganz leicht und lesbarer Weise ein wenig von FP zu Java hinzuzufügen. Insbesondere in diesem Schließung Wikiseite können Sie ein Beispiel sehr ähnlich finden, was Sie versuchen, zu erreichen

Dies ist offensichtlich auf Ihren Anruf, aber mit den meisten API Demos habe ich verwendet, ich ziehe das längere Format, das Sie an der Spitze haben. Nachdem ich den Code schauen über ich normalerweise copy-and-paste die API-Werke, um zu überprüfen, wie ich es denke, dann ist es von dort nicht verändert. Ändern des Formats einige der repetative Stücke zu verstecken ist auf jeden Fall, was Sie für OO Entwicklung tun wollen, aber ich denke, dass dies irgendwie Demo-Code ist etwas, das die ‚sauberen Code Götter‘ :-) verstehen würde.

Es gibt keine Möglichkeit, dies in Java zu tun, sondern versuchen, groovy zu verwenden, wenn es für Sie möglich ist. Die andere Option, die Sie ähnliche Verpackung haben können, ist Aspekt verwenden. finden Sie unter aspectj .

Ich habe gelernt, die Möglichkeit, dies in Java getan wird, ist eine Schnittstelle zu schaffen, die eine Methode hat. In Ihrem Code verwenden Sie Klassen, die eine Schnittstelle zu implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top