Gerade habe ich einen Anwendungsfall für Closures. Ich habe sequenziellen Code a la:
tueA();
tueB();
tueC();
Ich möchte gerne mitloggen, wie lange die einzelnen Schritte dauern (um das Beispiel zu vereinfachen, logge ich durch Ausgabe auf die Konsole):
long startTime = System.currentTimeMillis();
tueA();
System.out.println("duration in sec: " + ((System.currentTimeMillis() - startTime) / 1000));
startTime = System.currentTimeMillis();
tueB();
System.out.println("duration in sec: " + ((System.currentTimeMillis() - startTime) / 1000));
startTime = System.currentTimeMillis();
tueC();
System.out.println("duration in sec: " + ((System.currentTimeMillis() - startTime) / 1000));
Das funktioniert, nur den eigentlichen Code kann man kaum wiederfinden. Wenn ich Closures (wie z.B. in Groovy) zur Verfügung habe, ist es ganz einfach:
def timeLogged (Closure c) {
long start = - System.currentTimeMillis()
c.call()
println "duration in sec: " + (System.currentTimeMillis() + start) / 1000;
}
timeLogged { tueA() }
timeLogged { tueB() }
timeLogged { tueC() }
Das ist kürzer, redundanzfreier und meiner Meinung nach deutlich besser lesbar.
P.S.: Redundanzfrei kann es ohne Closures in Java natürlich auch hinkriegen, mit anonymen Inner Classes. Dummerweise wird der Code dann noch länger und noch schwerer lesbar.
Hinterlasse einen Kommentar