Interfejsy w Javie przez lata miały pewną cechę, o którą zawsze pytano na rozmowach kwalifikacyjnych. Mianowicie na każdej rozmowie padało pytanie
"jakiego rodzaju są wszystkie metody w interfejsach?". Odpowiedzią na to pytanie było stwierdzenie, że "każda metoda w interfejsie jest publiczna i abstrakcyjna".
Dodatkowo mogliśmy wspomnieć, że nie trzeba tego pisać (tego, czyli słów
public abstract), gdyż
modyfikatory są dodawane automatycznie (niejawnie)
Parę lat temu ten utarty schemat uległ zmianie, gdyż wraz z nowymi wersjami Javy pojawiły się też nowe możliwości definiowania metod w interfesjach.
O metodach domyślnych wspominaliśmy już poprzednio (nowość od Javy 8). Dla porządku przypomnimy tylko, że metoda domyślna to taka metoda, która jest
opisana słowem kluczowym
default i która posiada swoje ciało. Nie jest więc metodą abstrakcyjną.
Na tym zmiany jednak się nie kończą, ba nawet w samej wersji 8 języka wprowadzone zostało jeszcze jedno rozwiązanie, a konkretnie możliwość używania metod statycznych w interfejsach.
Metody statyczne w interfejsach
Jeśli jeszcze nie wiecie co to metody statyczne, to polecamy zajrzeć do rozdziału
Metody statyczne.
Jeśli już wiecie, to przyjcie się przykładowi metody
statycznej w interfejsie. Wygląda ona tak:
Metodę wywołujemy zgodnie z zasadami dotyczącymi metod statycznych, czyli nie tworzymy obiektu, a odwołujemy się bezpośrednio do interfejsu:
Szukasz dobrego kursu nowej Javy? Mamy dla Ciebie kurs oparty na 150 przykładach.
Kurs nowej Javy składa się z kursu Javy 8 oraz Javy od wersji 9 do 17.
Metody prywatne w interfejsach
A teraz najnowszy hit. Od Javy 9, w interfejsach możemy używać również metod prywatnych! Dla purystów językowych z dawnych lat jest to pewnie trudne do przełknięcia, ale
okazuje się jednak, że przy bliższym przyjrzeniu się sprawie - ma to sens.
Metody prywatne wpływają pozytywnie na użyteczność kodu wewnątrz interfejsów. W momencie gdy Java pozwala nam na używanie metod domyślnych, a więc zezwala
na wprowadzanie ciała metod, dosyć łatwo można sobie wyobrazić sytuację, w której dwie metody domyślne używają tego samego fragmentu kodu.
I właśnie taki współdzielony kod może być umieszczony w jednej metodzie prywatnej, która będzie wywołana przez te metody.
W ten sposób unikniemy duplikacji kodu. Zobaczmy to na przykładzie.
Mamy tutaj dwie metody domyślne, które wykorzystują ten sam
algorytm dodawania dwóch liczb. W obu przypadkach korzystamy z metody zwracającej
wynik algorytmu -
getItemValue, a następnie wynik ten w pierwszym przypadku mnożymy przez wartość parametru
value, a w drugim dodajemy do wyniku wartość analogicznego parametru.
Gdyby nie istniały metody prywatne, to albo musielibyśmy duplikować wyliczanie algorytmu zarówno w metodzie
multiply
jak i w metodzie
sum, albo ewentualnie zamiast metody prywatnej użylibyśmy metodę domyślną lub statyczną. Tylko, że w tym przypadku metoda taka była by
publiczna, a więc widziana w każdym miejscu naszego projektu. Pytanie po co taką metodę udostępniać wszędzie jeśli wykorzystujemy ją tylko w tym interfejsie.
Nie jest to nam do niczego potrzebne. W takiej sytuacji w zupełności wystarczy nam użycie metody prywatnej i to dobrze, że od Javy 9 mamy taką opcję.
Na koniec warto wspomnieć jeszcze o tym co niejako samo się nasuwa.
Prywatne metody w interfejsach mogą być również metodami statycznymi. Zatem wygląda to podobnie, jak
w przypadku metod statycznych w klasach.
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Czy informacje, które otrzymałeś, były pomocne?
Jeśli tak, zapraszam Cię do podarowania mi kawy.
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.
Po co używać metod prywatnych w interfejsie? Czy nie tworzymy interfejsu jako bazy do tworzenia innych klas?
Czy nie lepiej jest zaimplementować działanie tego a'la kalkulatora w jakiejś konkretnej klasie?
Robert
Oczywiście, w zdecydowanej większości przypadków tworząc logikę aplikacji będziemy
to robić, zgodnie z dobrymi praktykami, w dedykowanych klasach.
Sensu istnienia metod prywatnych w interfejsach należy doszukiwać się w istnieniu
metod domyślnych.
W momencie pojawienia się w Javie metod domyślnych tworzenie metod o częściowo zbliżonej funkcjonalności
doprowadzało do duplikacji kodu.
Dlatego też w kolejnej wersji Javy (9) zostały wprowadzone metody prywatne, aby można było ten kod wyodrębnić do osobnej metody.
Po prostu pozwalają na uniknięcie wspomnianej duplikacji.
Można pójść z pytaniem dalej i zapytać, po co w ogóle
metody domyślne w interfejsach. I tu odpowiedź jest bardzo ciekawa.
Java 8 wprowadziła ogromną liczbę nowości, które wymusiły też zmiany w istniejącym już kodzie poprzednich wersji Javy.
Programiści Javy potrzebowali dodać nowe metody do istniejących już interfejsów, co normalnie wiązałoby się
z koniecznością wprowadzenia ciała tych metod we wszystkich klasach implementujących te interfejsy, będących częścią Javy od początku.
Wymyślili oni więc, że dobrze jest wprowadzić możliwość dodania nowego typu metod, którego klasy nie będą musiały implementować.
Do tego metody te miały oczywiście wykonać konkretne zadania.
I tak powstały metody domyślne.
Dla osób programujących w Javie metody te potrafią być przydatne dokładnie z tego samego powodu.
Pomocne są szczególnie w trakcie rozwoju dużych projektów, gdzie dawniej modyfikacja jednego interfejsu wymagałaby dostarczenia implementacji w wielu klasach, a być może w większości implementacja ta byłaby zbędna i ciała metod pozostawałyby puste.