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 😉