W moim przypadku chodziło o przekazanie nazw paru plików, które jeśli są mogą zostać użyte do załadowania danych związanych z liczeniem nowych tagów, a jak ich nie ma to można je po prostu zignorować.
Zdarzało mi się używać obu technik.
Tak dla przypomnienia overload to posiadanie kilku metod czy konstruktorów z różnymi parametrami, np. coś takiego:
void test();
void test(int a);
void test(int a, int b);
void test(int a, int b, int c);
void test(int a);
void test(int a, int b);
void test(int a, int b, int c);
A varargs to coś takiego:
void test(int... args);
Użycie tego kodu jest zawsze podobne i można swobodnie napisać takie coś:
t.test();
t.test(1);
t.test(1,2);
t.test(1,2,3);
t.test(1);
t.test(1,2);
t.test(1,2,3);
Zakładając, ze w t mamy implementację klasy z metodami z wyżej.
Co ciekawe nawet w bytecode nie ma zbytniej różnicy.
Wychodzi mi na to, że oba sposoby są koszerne, ale wiele zależy od miejsca i sposobu użycia.
Varargs są "ładniejsze" bo mniej jest metod, ale trochę cierpi na tym discoverability kodu bo zamiast zobaczyć metody z nazwami parametrów zobaczymy tylko 1 z varargsem, z drugiej strony nie zaśmieca to przestrzeni nazw więc też może zmniejszyć krzywą uczenia się danego API.
Sam mam zwykle tendencję do używania overload gdy chodzi o konstruktory i gdy wydaje mi się, że obie wersje metody będą tak samo często używane, a varargs zwykle gdy mam w kodzie masę użyć bez tego dodatkowego parametru i teraz coś muszę dodać ;-)
Tak np. gdy pisałem coś co pobierało dane z DynamoDB to miałem metodę get, która w końcu w rzadkich przypadkach musiała mieć przekazany bardziej dokładny parametr, który pomagał deserializować JSONa i ponieważ większość użyć w kodzie była bez tego to dodałem vararga ;-) chociaż jak tak myślę to raczej było to przez to, że łatwiej mi było zrobić test na długość tego varargs (i nulla...) i zawołać inną metodę w treści kodu niż mieć 2 implementacje bez tego ifa.
Właśnie, varargs ma wadę bo jak się to to pisze to człowiek nie pamięta czy w razie braku to przychodzi null, czy tablica długości 0? :-)
Przychodzi tablica długości 0, ale tak naprawdę trzeba też sprawdzić tego null'a bo zawołanie z null też jest legalne ;-)
Podobne postybeta
Rant śmietnikowy ;-)
Refleksje i serializacja w Java'ie - podstawy i obalanie mitów ;-)
finalize() - do czego służy, a do czego nie i z czym to się je.
Jak z metody size() w List w Java'ie dostać ujemną liczbę? ;-)
"Ochidna" Echidna ;-) czyli jak się mają prace nad RDrive.
Brak komentarzy:
Prześlij komentarz