Java 8 – Functional Interfaces

Java 8 bereichert das Java um Functional Interfaces. Ein Interface ist genau dann ein Functional Interface wenn es nur eine abstrakte Methode definiert.

Java 8 bereichert das Java Universum um Functional Interfaces. Ein Interface ist genau dann ein Functional Interface wenn es nur eine abstrakte Methode definiert. Ein populäres Beispiel dafür ist java.lang.Runnable da es lediglich

void run();

als abstrakte Methode definiert. Das funktionale Interface wird in weiterer Folge benötigt, um Lambda Ausdrücke, Methodenreferenzen und Klassenreferenzen nutzen zu können. Dazu hier im Blog bald mehr.

Um ein Interface bewusst als funktionales Interface zu kennzeichnen gibt es, seit Java 8, die neue Annotation @FunctionalInterface. Ein Interface mit dieser Annotation wirft beim Kompilieren einen Fehle, wenn es die Voraussetzungen dafür nicht erfüllt.

Ein funktionales Interface darf zwar nur eine abstrakte Methode definieren, kann jedoch beliebig viele default und static Methoden (siehe meinen Blogpost Java 8 – Erweiterungen rund ums Interface) führen.

Ähnliche Artikel:

Java 8 – Erweiterungen rund ums Interface

In Interfaces können mit Java 8 nun statische und default Methoden definiert werden. Dies hilft dabei den eigenen Code wartbarer zu gestalten.

Mit dem Release von Java 8 stehen uns Java Entwicklern wieder eine Fülle neuer Möglichkeiten ins Haus. Unter anderem wurden die Mittel, die uns bei der Nutzung eines Interface gegeben sind, erweitert.

Statische Methoden in Interfaces

In Interfaces können nun statische Methoden definiert werden. Zu sehen im JDK selbst z.B. im Comperator Interface, dass u.a. um Funktionen für besondere Reihenfolgen erweitert wurde.

Damit ist es möglich für ein Interface Foo eine Util Klasse Foos, welche unter anderen im JDK bei java.util.Collection und deren Subinterfaces üblich sind, zu vereinfachen bzw. ganz aufzulösen. Die Funktionalität kann nun einfach im Interface selbst umgesetzt werden. Perfekte Kandidaten sind dabei Methoden von z.B. Arrays

Siehe auch: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html#static

Default Methoden in Interfaces

Zusätzlich können Interfaces in Java 8 um Default Methoden erweitert werden. Man erschafft damit Methoden die sich die Klassen, welche das Interface beerben in voller Funktionalität aneigenen. Dies birgt den Vorteil der Single-Inheritance in Java entgegenwirken zu können. Zusätzlich kann man damit neue Funktionalität zu Intefaces hinzufügen, ohne die Binärkompatiblität mit älterem Code zu brechen.

public interface Human {  
   void eat();  
   int count(String… obj);  
   default void breathe() {  
     // ...  
   }  
 }

Jegliches weitere Interface, welches das Interfaces Human erweitert, kann nun auf 3 Arten mit der default Methode umgehen:

      1. Sie unbeachtet lassen, dabei erbt sie die Funktionalität der default Methode.
      2. Sie erneut deklarieren, so dass sie, wie die ansonsten üblichen Methoden in Interfaces abstrakt ist, und somit implementiert werden muss.
      3. Sie überschreiben mittels neuer default Methode.

Siehe auch: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

Eine ausführlichere Zusammenfassung rund um das Thema Interface findet sich unter http://java-latte.blogspot.co.at/2014/01/everything-about-interface-in-java.html

Ähnliche Artikel: