Samstag, 27. Juli 2019

Die Annotation @FunctionalInterface

Die Annotation @FunctionalInterface erinnert vielleicht ein wenig an @Override - auch sie dient dazu, Hilfe vom Compiler zu bekommen, um Programmierfehler zu vermeiden. Um was geht es? Natürlich um funktionale Interfaces. Dazu an dieser Stelle ein ganz kleiner Exkurs, damit auch jeder die Sache versteht.

 Funktionale Interfaces wurden in Java 8 eingeführt. Sie bezeichnen Interfaces, die nur eine einzige abstrakte Methode definieren. Der folgende Code zeigt zwei Interfaces - das erste ist funktional, das zweite nicht.

 public interface FunctionInterface{
     void myMethod();
}

public interface NotFunctionalInterface{
    void myFirstMethod();
    void mySecondMethod();
}


 Interfaces mit nur einer Methode hat es doch schon immer gegeben. Warum benötigen sie jetzt auf einmal einen eigenen Namen? Weil es viel mehr ist als nur ein Name. In Java 8 haben funktionale Interfaces eine wirkliche syntaktische Bedeutung im Rahmen von Lambda-Ausdrücken. Diesem Thema widme ich bei Gelegenheit noch eigene Blog-Beiträge. Jetzt erst einmal zur Annotation.

Wir können funktionale Interfaces mit @FunctionalInterface markieren. Damit sagen wir dem Compiler: "He, Compiler. Dieses Interface soll funktional sein. Pass mal bitte mit auf." Jetzt sollte jeder von uns bis eins zählen können - das traue ich jedem Leser dieses Blogs zu. Warum benötigt man dann diese Annotation?

Seine wirkliche Stärke erhält @FunctionalInterface, wenn ein Interface geändert wird. Nehmen wir mal das erste Beispiel von oben. Ich führe in das Interface FunctionalInterface noch eine zweite Methode ein, weil sich mein Programm ja weiter entwickelt. Mit einem Schlag würden alle Lambda-Ausdrücke, die dieses Interface verwenden, nicht mehr funktionieren. Wenn ich mein funktionales Interface mit @FunctionalInterface markiere und ich füge irgendwann aus Versehen eine weitere Methode ein, wird der Compiler sich darüber beschweren und mich auf diesen Fehler aufmerksam machen. Im Folgenden noch ein Beispiel mit der Annotation.

public interface FunctionInterface{
    @FunctionalInterface
    void myMethod();
}

Keine Kommentare:

Kommentar veröffentlichen