Closures für Java
Eine der Neuerungen, die sich in Java SE 7 ankündigen, sind
Closures (siehe auch
hier. Dabei geht es im wesentlichen darum, eine Erweiterung zu schaffen, mit der man Funktionen als Variablenwerte verwenden kann. Man kann also einer Variablen eine Funktion zuweisen oder ad hoc eine erstellen. Dies hat weitreichende Konsequenzen. In Java SE betrifft dies zum Beispiel die Collections: Man muss nicht mehr "per Hand" über eine Collection iterieren, sondern kann einfach die Funktion übergeben, die für jedes Element ausgeführt werden soll.
Bei Spring könnte man den Template-Ansatz vereinfachen. Bisher sieht die Verwendung des JmsTemplates zum Beispiel so aus:
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return session.
createTextMessage("Text Message");
}
});
(Es gibt in diesem Fall natürlich noch die Vereinfachung
jmsTemplate.convertAndSend("A Text Message"); . Aber davon wollen wir mal absehen. Mit Closures könnte man das ganze nun so schreiben:
jmsTemplate.send( (Session session) {
session.createTextMessage("Text Message");
}
);
In diesem Fall nutzt man nicht die Möglichkeit, eine Funktion einer Variablen zuzuweisen, sondern sie direkt einer Methode zu übergeben. Dies weißt auch auf das Problem bei der Sache hin: Im Prinzip ist das ganze eine Möglichkeit, etwas ähnliches zu tun, wie man es mit Inner Classes und Anonymous Inner Classes macht. Damit befindet man sich in der Zwickmühle: Inner Classes sind aufwändiger und vielleicht auch schwerer zu verstehen als Closures. So gibt es Entwickler, die das Schreiben eines
ActionListeners für einen
JButton berechtigterweise als kompliziert empfinden. Aber man wird dieses Verfahren aus der Java Sprache nicht eliminieren können, weil man sonst vorhandene Software bricht und zwar viele vorhandene Software.
Somit schafft man einen zweiten Weg für dasselbe, was ich für ungeschickt halte, aber wohl nicht zu ändern ist und dem Fortschritt nicht im Wege stehen sollte...