JAXenter.de

Das Portal für Java, Architektur, Cloud & Agile
X

Wieviel Cyborg steckt jetzt schon im Menschen? Die webinale VISIONS klärt auf.

Funktionale Programmierung in Java

Effective Java: Im Zeichen der 8

©S&SMedia

Als Java-Entwickler beschreiben wir, wie Objekte aussehen, wenn wir eine Klasse definieren, d. h. wir legen fest, welche Daten den Zustand eines Objekts beschreiben und welche Methoden die Fähigkeiten eines Objekts ausmachen. Wir erzeugen Objekte, wenn wir von den Klassen Instanzen bilden. Wir verändern Objekte beispielsweise, wenn wir die Felder ändern oder Methoden aufrufen, die dies tun. Wir reichen Objekte herum, wenn wir sie z. B. als Argumente an Methoden übergeben. Mit Objekten sind wir als Java-Entwickler bestens vertraut.

In funktionalen Sprachen (wie zum Beispiel Erlang oder Haskell) stehen nicht Objekte, sondern Funktionen im Vordergrund. Funktionen ähneln Methoden; sie repräsentieren ausführbare Funktionalität. Sowohl Methoden als auch Funktionen werden aufgerufen und ausgeführt. Funktionen in funktionalen Sprachen werden darüber hinaus herumgereicht. Man übergibt sie beispielsweise als Argumente an Operationen; diese Operationen können dann die übergebenen Funktionen in einem bestimmten Kontext aufrufen. Funktionen können auch als Return-Wert einer Operation zurückgegeben werden. Das heißt, in funktionalen Sprachen werden Funktionen herumgereicht wie Objekte in objektorientierten Sprachen. Dieses Prinzip des Herumreichens von Funktionen wird auch als „Code-as-Data“ bezeichnet.

Funktionen werden aber nicht nur übergeben und aufgerufen, sondern auch kombiniert und verkettet oder manipuliert und verändert. Es gibt z. B. das sogenannte Currying (benannt nach Haskell Brooks Curry), bei dem aus einer Funktion mit mehreren Argumenten durch Argument-Binding eine Funktion mit einem Argument gemacht wird. In einer reinen funktionalen Sprache (pure functional language) haben die Funktionen nicht einmal Seiteneffekte. Das heißt insbesondere, dass Funktionen keine Daten verändern, sondern bestenfalls neue Daten erzeugen.

Soviel zur Theorie. Was fängt man damit in der Praxis an? Kann man funktionale Prinzipien in Java überhaupt gebrauchen? Zur Illustration wollen wir uns ein Idiom ansehen, bei dem Funktionen eine wesentliche Rolle spielen und das auch in Java recht nützlich sein kann. Es geht um das Execute-Around-Method-Pattern.

Copyright @ 2013-2014 by Angelika Langer & Klaus Kreft. All rights reserved

Mehr aus dieser Ausgabe

Artikel erschienen in

©Ingram
Kann man eine App in fünf Minuten erstellen? Ein gewagtes Unterfangen, aber…
©S&SMedia
Mangelnde Security ist der Grund Nummer 1, warum iOS in Unternehmen gegenüber (…
©iStock/fotostorm
NoSQL führt eine Vielzahl neuer Technologien in die Datenbankszene ein. Das…
©iStock/gazza30, ©iStock/filo
Seit Mitte Dezember 2012 ist das Projekt Nashorn im OpenJDK angekommen, mit dem…
©S&SMedia
Als Java-Entwickler beschreiben wir, wie Objekte aussehen, wenn wir eine Klasse…
Das Testen von Software bildet einen wichtigen Bestandteil in der…
Nashorn ist die neue JVM-basierte JavaScript-Implementierung im JDK 8
Seit Mitte Dezember 2012 ist das Projekt Nashorn im OpenJDK angekommen, mit dem…
 

Kommentare

von Simon (Unveröffentlicht) am
"Code-As-Data" beschreibt nicht wie im Artikel genannt das herumreichen von Funktionen (--> "Higher Order functions") vielmehr kommt "code-as-data" aus dem Lisp Bereich da dort mittels Makros der Code direkt verändert werden kann bzw ein String eben als String oder als ausführbarer Code betrachtet werden kann.

von Angelika Langer (Unveröffentlicht) am
"code as data" war nicht in Anlehnung an Lisp gemeint, sondern so wie es auch die Sprachdesigner bei Oracle verwenden (siehe z.B. http://stuartmarks.files.wordpress.com/2012/10/con5089_marks_jumpstartinglambda-v3.pdf, Seite3). Es heißt einfach nur: Lambdas ermöglichen es uns, Code (oder Funktionalität) herumzureichen - also mit Code das zu tun, was wir in einer objekt-orientierten Sprache wie Java bislang nur mit Daten (oder Objekten) gemacht haben.

von Landei (Unveröffentlicht) am
Der Code-Highlighter scheint die Generics aufzufressen (zumindest in meinem Chrome sehe ich keine)...

Bild des Benutzers Redaktion JAXenter
von Redaktion JAXenter am
Oh ja tatsächlich - der Code Highlighter hat uns die spitzen Klammern aufgefressen! Jetzt sollten die Listings aber alle korrekt sein! Vielen Dank für den Hinweis!

Seiten

Ihr Kommentar zum Thema

Als Gast kommentieren:

Gastkommentare werden nach redaktioneller Prüfung freigegeben (bitte Policy beachten).