W poprzednich rozdziałach regularnie używaliśmy interfejsów, które mają tylko jedną metodę
abstrakcyjną. Nadszedł czas, aby to wyjaśnić. Od Javy 8 każdy interfejs, który posiada dokładnie jedną metodę abstrakcyjną,
z miejsca staje się
interfejsem funkcyjnym.
Tak więc takim interfejsem jest zarówno interfejs:
jak i taki interfejs (pochodzący ze źródeł Javy):
Ten drugi może budzić trochę wątpliwości, gdyż poza metodą abstrakcyjną
compare,
zawiera jeszcze dwie inne metody, z których co najmniej jedna wygląda również na abstrakcyjną. Mamy tu jednak do odnotowania dwa fakty:
- Metoda reversed to metoda domyślna, a więc nie liczy się, gdyż nie jest metodą abstrakcyjną.
- Metoda equals to owszem, metoda abstrakcyjna, ale należy do zbioru metod zdefiniowanych w klasie Object, a te metody nie są brane pod uwagę.
Krótko mówiąc, precyzyjna definicja interfejsu funkcyjnego powinna brzmieć -
"Interfejs funkcyjny to interfejs posiadający dokładnie jedną metodę abstrakcyjną, z wyłączeniem
metod przesłaniających metody z klasy Object".
Adnotacja @FunctionalInterface
W Javie 8 istnieje adnotacja, która pomaga weryfikować, czy dany interfejs faktycznie jest interfejsem funkcyjnym.
Oznaczając interfejs adnotacją
@FunctionalInterface, dajemy znać kompilatorowi, że dany
interfejs ma być interfejsem funkcyjnym i wtedy kompilator sprawdza, czy istnieje w nim jedna abstrakcyjna metoda.
W przypadku gdy warunki nie są spełnione, kod nie będzie się kompilował.
W Intellij dostaniemy dwa różne komunikaty w zależności od tego, czy w ogóle nie dodaliśmy metody lub czy nie dodaliśmy ich przypadkiem za dużo:
Tak będzie to wyglądało, jeśli użyjemy poprawnej konstrukcji...
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.