Back

11th April 2024

#Programming#Java

Interfejsy i Lambdy w Javie

Blog image

Ostatnio dodałem artykuł, w którym poruszałem temat różnych rodzajów klas w Javie. Teraz nadszedł więc czas na opisanie interfejsów, które na pierwszy rzut oka są trochę podobne do klas abstrakcyjnych. W artykule tym przedstawię czym są interfejsy, do czego ich używamy, porównam jak wyglądały przed Javą w wersji 8, i po niej, porównam interfejsy do klas abstrakcyjnych oraz poruszę temat wyrażeń lambda. Zapraszam do lektury!

Czym są interfejsy?

Wyobraź sobie myszkę, klawiaturę, drukarkę lub pendrive'a. W dzisiejszych czasach wszystkie te urządzenia peryferyjne korzystają z interfejsu USB. Zastanawiając się chwilę można dojść do wniosku, że urządzeń, które go implementują jest o wiele więcej. Możemy więc dostrzec, jak dużą elastyczność dają nam takie interfejsy jak USB. Poprzez jego wykorzystanie, możemy zdefiniować wspólne zachowanie dla różnych klas urządzeń, co pozwala na spójne zarządzanie oraz podłączenie ich do każdego komputera. Teraz spójrz na praktyczny przykład z kodu:

Blog image

Na powyższym obrazku widzimy zdefiniowany interfejs USB. Interfejs ten definiuje wspólne metody obsługi dla wszystkich urządzeń USB pozwalające na połączenie, rozłączenie, odczyt oraz zapis danych. Możemy z pomocą takiego interfejsu obsłużyć myszki, klawiatury, drukarki i inne urządzenia. Spójrz teraz na poniższy przykład implementacji interfejsu USB.

Blog image

Klasa Mouse implementuje interfejs USB. Oznacza to, że trzeba w niej dodać własną implementację dla wszystkich metod z tego interfejsu. I tak samo byłoby w przypadku klas Keyboard czy Printer, jeśli implementowałyby interfejs USB. Dla każdej z nich musielibyśmy dodać własną, konkretną dla danego urządzenia implementację metody connect(), disconnect(), sendData() oraz receiveData().

Cechy interfejsów

Porównanie interfejsów przed i po Java 8

Przed Java 8

Po Java 8

Interfejs vs. Klasa abstrakcyjna

Interfejs

Klasa abstrakcyjna

Kiedy użyć interfejsów, a kiedy klas abstrakcyjnych?

Użyj interfejsu gdy

Użyj klasy abstrakcyjnej gdy

Wyrażenia lambda

Wyrażenia lambda w Javie to w rzeczywistości funkcje anonimowe (bez nazwy), które mogą być przypisane do zmiennych lub przekazywane jako argumenty do metod. Definicja takiej funkcji składa się z listy parametrów, strzałki i ciała funkcji:

( parametry ) -> { ciało_funkcji }

Wyrażenia lambda mają szerokie zastosowanie. Można je spotkać chociażby wewnątrz streamów wykorzystywanych do operacji na kolekcjach czy w wątkach. Ale z racji tego, że jest to artykuł poświęcony interfejsom, to skupię się tutaj na ich głównym zastosowaniu, czyli interfejsach funkcyjnych. Interfejsy funkcyjne to takie, które zawierają dokładnie jeden nagłówek niezaimplementowanej metody.

Blog image

Blog image

Blog image

Możliwe są także dalsze skrócenia wyrażeń lambda za pomocą metod referencyjnych. Metody referencyjne pozwalają na zdefiniowanie wyrażenia lambda w bardziej zwięzły sposób.

Blog image

Blog image

W powyższym przykładzie metoda referencyjna System.out::println jest skrótem dla wywołania System.out.println(name), czyli jest równoważna funkcji (name) -> {System.out.println(name)}.

Podsumowanie

W tym artykule omówiłem sporo ważnego materiału. Przedstawiłem podstawowe narzędzie osiągania polimorfizmu, którym są interfejsy, pokazałem, do czego ich używamy, porównałem jak wyglądały przed Javą w wersji 8, i po niej. Następnie zestawiłem interfejsy z klasami abstrakcyjnymi oraz poruszyłem temat wyrażeń lambda.

Jak zwykle polecam przećwiczyć sobie omówione w tym artykule koncepty i bardzo dobrze się ich nauczyć. Są to bardzo przydatne narzędzia, bez których nie jest możliwe efektywne stworzenie większego projektu.

Back to articles