Default-Methoden und statische Methoden in Interfaces

Effective Java: Interfaces

Angelika Langer, Klaus Kreft


Lambdas I

Bisher mussten Methoden in Interfaces in Java abstrakt sein. Das heißt, eine Methode in einem Interface legte allein ihre Signatur und ihre allgemeine Semantik fest. Eine Implementierung konnte sie nicht haben. Die Implementierung wurde erst von den (nicht abstrakten) Klassen, die von dem Interface abgeleitet waren, zur Verfügung gestellt.

Das ändert sich mit Java 8. Eine Default-Methode kann eine Methode mit Implementierung in einem Interface zur Verfügung stellen. Diese Implementierung wird dann an alle abgeleiteten Interfaces und Klassen vererbt, sofern diese sie nicht mit einer eigenen Implementierung überschreiben. Das ist eine tiefgreifende Änderung beim Programmieren in Java. Warum sie notwendig geworden ist und was sie im Detail bedeutet, sehen wir uns weiter unten genauer an.

Zunächst zu einer weiteren Änderung: Mit Java 8 wird es auch möglich sein, statische Methoden in Interfaces zu implementieren.

In beiden Fällen (Default-Methode und statische Methode) sind die Methoden automatisch public, wie es bei abstrakten Methoden auch bisher schon war. Es wurde diskutiert, andere Zugriff-Modifier wie z. B. private zuzulassen. Am Ende hat man dies aber aus Aufwandsgründen verworfen. Es ist aber nicht ausgeschlossen, dass Zugriff-Modifier wie z. B. private in einem zukünftigen Java-Release nach Java 8 erlaubt sein werden. Die Details der Diskussion zu diesem Thema finden sich unter [2].

Default-Methoden

Überraschend ist, dass Default-Methoden im Rahmen des JSR 335 (Lambda Expressions for the Java Programming Language) entwickelt wurden. Auf den ersten Blick erschließt sich die Beziehung zwischen Lambda-Ausdrücken und Default-Methoden nicht. Deshalb wollen wir uns zunächst diesen Zusammenhang ansehen.

Wie wir auch in [1] bereits kurz erwähnt haben, werden die Collections im JDK 8 über zusätzliche Funktionalität für Bulk Operations bzw. interne Iterierung verfügen. Auch dies ist eine Entwicklung im Rahmen des JSR 335. Schauen wir uns dazu ein Beispiel an. Die Details finden sich in [3]. Mit dem folgenden Code kann man alle Elemente einer Collection (im Beispiel eine ArrayList) ausgeben:

List numbers = new ArrayList();... populate list ...numbers.forEach(number -> System.out.println(number));

Zentrales Element des Beispiels ist die mit Java 8 neu hinzugekommene forEach()-Methode. Ihr wird ein Lambda-Ausdruck übergeben, dessen Funktionalität dann im forEach() auf jedes Element der Collection angewandt wird. In unserem Beispiel ...

Default-Methoden und statische Methoden in Interfaces

Effective Java: Interfaces

Angelika Langer, Klaus Kreft


Lambdas I

Bisher mussten Methoden in Interfaces in Java abstrakt sein. Das heißt, eine Methode in einem Interface legte allein ihre Signatur und ihre allgemeine Semantik fest. Eine Implementierung konnte sie nicht haben. Die Implementierung wurde erst von den (nicht abstrakten) Klassen, die von dem Interface abgeleitet waren, zur Verfügung gestellt.

Das ändert sich mit Java 8. Eine Default-Methode kann eine Methode mit Implementierung in einem Interface zur Verfügung stellen. Diese Implementierung wird dann an alle abgeleiteten Interfaces und Klassen vererbt, sofern diese sie nicht mit einer eigenen Implementierung überschreiben. Das ist eine tiefgreifende Änderung beim Programmieren in Java. Warum sie notwendig geworden ist und was sie im Detail bedeutet, sehen wir uns weiter unten genauer an.

Zunächst zu einer weiteren Änderung: Mit Java 8 wird es auch möglich sein, statische Methoden in Interfaces zu implementieren.

In beiden Fällen (Default-Methode und statische Methode) sind die Methoden automatisch public, wie es bei abstrakten Methoden auch bisher schon war. Es wurde diskutiert, andere Zugriff-Modifier wie z. B. private zuzulassen. Am Ende hat man dies aber aus Aufwandsgründen verworfen. Es ist aber nicht ausgeschlossen, dass Zugriff-Modifier wie z. B. private in einem zukünftigen Java-Release nach Java 8 erlaubt sein werden. Die Details der Diskussion zu diesem Thema finden sich unter [2].

Default-Methoden

Überraschend ist, dass Default-Methoden im Rahmen des JSR 335 (Lambda Expressions for the Java Programming Language) entwickelt wurden. Auf den ersten Blick erschließt sich die Beziehung zwischen Lambda-Ausdrücken und Default-Methoden nicht. Deshalb wollen wir uns zunächst diesen Zusammenhang ansehen.

Wie wir auch in [1] bereits kurz erwähnt haben, werden die Collections im JDK 8 über zusätzliche Funktionalität für Bulk Operations bzw. interne Iterierung verfügen. Auch dies ist eine Entwicklung im Rahmen des JSR 335. Schauen wir uns dazu ein Beispiel an. Die Details finden sich in [3]. Mit dem folgenden Code kann man alle Elemente einer Collection (im Beispiel eine ArrayList) ausgeben:

List numbers = new ArrayList();... populate list ...numbers.forEach(number -> System.out.println(number));

Zentrales Element des Beispiels ist die mit Java 8 neu hinzugekommene forEach()-Methode. Ihr wird ein Lambda-Ausdruck übergeben, dessen Funktionalität dann im forEach() auf jedes Element der Collection angewandt wird. In unserem Beispiel ...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang