W poprzednim wpisie, poznaliśmy czym są Interfejsy w Javie. Jednak temat interfejsów jest znacznie szerszy niż zostało to przedstawione w poprzednim wpisie 😊 Dziś kontynuujemy tę wędrówkę!

01. Metody domyślne w Interfejsach

Pierwszą poważną zmianą w interfejsach dostaliśmy wraz z nadejściem Javy 8. Mowa oczywiście o metodach domyślnych. W poprzednim wpisie napisałem że o interfejsie możemy myśleć jak o kolekcji abstrakcyjnych metod, to nie do końca jest prawdą od Javy 8 😉

Metoda domyślna w interfejsie to taka która posiada swoje ciało, i nie musi być implementowana przez klasa która implementuje dany interfejs. Od tej zasady jest wyjątek, kiedy klasa implementuje więcej niż jeden interfejs, w którym znajdują się takie same metody domyślne, wówczas klasa implementująca musi stworzyć własną implementację tej metody.

No to proste przykłady! Interfejs z metodą domyślną:

public interface SimpleInterface {

    void method();

    default void simpleDefault() {
        System.out.println("inside SimpleInterface simpleDefault method");
    }
    
}

Oraz prosta klasa która implementuje nasz interfejs:

public class SimpleClass implements SimpleInterface{

    @Override
    public void method() {
        System.out.println("this method is empty");
    }
    
}

Zauważ że klasa implementująca interfejs nie posiada własnej implementacji metody domyślnej interfejsu. Mimo to, bez żadnych przeszkód możemy z niej skorzystać! 😊

public class Main {

    public static void main(String[] args) {
        SimpleClass simpleClass = new SimpleClass();
        simpleClass.simpleDefault();
    }

}

Tak jak wspomniałem wcześniej sytuacja zmienia się odrobinę w momencie kiedy klasa implementuje więcej niż jeden interfejs, w którym znajduje się dokładnie taka sama metoda domyślna.

Tworzymy kolejny interfejs:

public interface SecondInterface {

    default void simpleDefault() {
        System.out.println("inside SecondInterface simpleDefault method");
    }
    
}

Oraz dokładamy ten interfejs do naszej klasy:

public class SimpleClass implements SimpleInterface, SecondInterface {

    @Override
    public void method() {
        System.out.println("this method is empty");
    }

    @Override
    public void simpleDefault() {
        System.out.println("konieczna implementacja!");
    }
}

Zauważ że w tym momencie metoda domyślna musiała zostać zaimplementowana.

Ważne jest aby wspomnieć o tym że interfejs może posiadać wiele metod domyślnych 😊 Java 8 to był naprawdę przełom pod wieloma względami! 😊

02. Metody statyczne w Interfejsach

Metody statyczne w interfejsie są nieco podobne do metod domyślnych, posiadają ciało metody! Jednak jest między nimi zasadnicza różnica, metody statycznej nie da się nadpisać (zaimplementować) w klasie która implementuje dany interfejs. Metoda statyczna interfejsu należy tylko i wyłącznie do konkretnego interfejsu, dzięki temu nie ma ryzyka że będziemy musieli wykonywać jakąś pracę w związku z tym że jakaś klasa implementuje różne interfejsy z taką samą statyczną metodą! Pozwala to na napisanie metody w interfejsie, która nie zostanie nadpisana.

public interface SimpleInterface {

    void method();

    default void simpleDefault() {
        System.out.println("inside SimpleInterface simpleDefault method");
    }

    static boolean simpleTest(String someString) {
        return someString != null && !someString.isEmpty();
    }

}

Klasa implementująca nic się nie zmieniła! 😊 Żeby skorzystać ze statycznej metody interfejsu musimy odnieść się bezpośrednio do niego!

SimpleInterface.simpleTest("abc");

Podsumowanie

Dzisiejszy wpis był kontynuacją poprzedniego wpisu o interfejsach, oraz kolejną częścią podstawowego kursu programowania w Javie! W tym momencie mamy już wystarczającą wiedzę żeby w pełni korzystać z interfejsów w Javie! Serdecznie zapraszam do eksperymentowania, to naprawdę potężne narzędzie w naszym arenale! Korzystajcie z nich często 😉