Kurs Java

Inne metody w interfejsach

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:
public interface Item {     
    
    public void setName(String name);
    
    public String getName();

    public String getDescription();
    
    public static void printInfo() {
        System.out.println("Item in StartAPPa");
    }
} 
Metodę wywołujemy zgodnie z zasadami dotyczącymi metod statycznych, czyli nie tworzymy obiektu, a odwołujemy się bezpośrednio do interfejsu:
public class Start {

    public static void main(String[] args) {
            
        Item.printInfo();        
    }    
}
Szukasz dobrego kursu nowej Javy? Mamy dla Ciebie kurs oparty na 150 przykładach.
Kurs od Javy 8 do 14
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.
public interface ItemBasicOperations {             
    
    private int getItemValue(int value1, int value2) {
        return value1 + value2;
    }    
    
    default int multiply(int value) {
        return getItemValue(4,3) * value;
    }   
    
    default int sum(int value) {
        return getItemValue(4,3) + value;
    }
}
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.
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
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.
kursjava@javappa.com
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?
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.

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE