Varargs – zmienna ilość parametrów metody

Może natrafiliście kiedyś na problem, w którym najlepszym rozwiązaniem byłoby wprowadzanie bardzo dużej ilości parametrów takiego samego typu. Nikomu jednak nie będzie chciało się deklarować 15 czy 20 argumentów i prawdopodobnie postawi na skorzystanie z kolekcji. Okazuje się, że Java wychodzi nam naprzeciw i pozwala nam zadeklarować to wszystko za jednym zamachem. Jest jednak kilka ograniczeń o których warto wiedzieć. Zapraszam do lektury.

Czym jest vararg?

Vararg jest to funkcjonalność, która pozwala nam na wprowadzenie dowolnej ilości parametrów danego typu.

Budowa metod z wykorzystaniem vararg

Mówiąc oczywiście o parametrach stałych, chodzi o zwyczajne parametry z którymi pracowaliście do tej pory.

Mówiąc o parametrze vararg, chodzi o zapis w postaci:

Przykładowa metoda z wykorzystaniem powyższej funkcjonalności:

Warto zwrócić uwagę na przypadek w którym wprowadzone zostało zero argumentów, ale o tym w ograniczeniach.

Ograniczenia

Pierwsze co rzuca się w oczy to oczywiście fakt, że w metodzie może znajdować się tylko jeden parametr typu vararg. Dodatkowym ograniczeniem jest to, że musi on znajdować się na końcu listy parametrów.
Tak jak wcześniej wspomniałem funkcjonalność ta pozwala nam na wprowadzenie dowolnej ilości argumentów, co za tym idzie, może także nie zostać wprowadzony żaden parametr.

Jak więc radzić sobie w przypadku, gdy wymagamy od użytkownika jednego bądź większej ilości argumentów?Wprowadzamy wtedy wymaganą ilość stałych parametrów takiego samego typu jak nasz parametr vararg.

Zmodyfikujmy więc nasz wcześniejszy przykład w taki sposób, aby sumował przynajmniej dwie liczby i wyświetlał ich wynik.

Ze względu na dwa parametry stałe nie możemy już wywołać naszej metody bez wprowadzania argumentów, przypominam, że one zawsze muszą zostać podane.

Interpretowanie wartości

Parametr vararg zwraca nam nic innego jak tablicę danego typu, wypełnioną podanymi przez nas wartościami, w wprowadzanej przez nas kolejności. int... integers -> int[] integers

Możemy więc iterować po danej tablicy w wygodny dla nas sposób, czy to będzie zwyczajna pętla for czy foreach.

Zastosowanie

Jak się pewnie domyślacie, takie rozwiązanie ma wiele zastosowań. Czy to w liczeniu średniej, mediany czy w rozwiązywaniu innych problemów.

Postanowiłem jednak, że podzielę się z wami przykładem, dzięki któremu zacząłem poszukiwać takich rozwiązań i bardzo dobrze, że na nie natrafiłem.

Zajmowałem się wysyłaniem pakietów przez protokół TCP/IP. Zawierał on w sobie typ, oraz w zależności od typu, określoną ilość parametrów.

Stworzyłem sobie więc w uproszczeniu klasę bardzo podobną do takiej.

Co zapewniło mi takie rozwiązanie? Mogłem tworzyć pakiety z dowolną ilością parametrów. Mogłem interpretować je w różny sposób w zależności od typu, mogły także nie podawać żadnego parametru poza typem.

Do czego zmierzam? Może się zdarzyć, że w danym projekcie natraficie na zadanie, w którym okaże się, że wykorzystanie takiej funkcjonalności pozwoli wam zamienić wiele wiele metod (osobna dla każdego pakietu w moim przypadku) na jedną która mocno ułatwia zarówno implementację jak i jej późniejsze wykorzystanie.

Posiadanie wiedzy teoretycznej -> ułatwienie nam życia w przypadku rozwiązywanie trudniejszych problemów 😉

Takim oto sposobem dotariliśmy do końca. Dzisiejszy wpis był bardzo krótki, no ale powiem szczerze w tym temacie chyba nie można się rozpisać bardziej. Temat sam w sobie jest bardzo prosty, zachęcam jednak do przetestowania kodu oraz napisania swojego. Może wcześniej wspomniana przeze mnie średnia bądź też mediana będą dobrymi przykładami. Następny wpis w przyszłym tygodniu. Miłego wieczoru!

Your email address will not be published. Required fields are marked *

*