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();        
    }    
}

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.
Linki
https://howtodoinjava.com/java9/java9-private-interface-methods
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

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:
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 .