sobota, kwietnia 08, 2023

overload vs varargs

Tak sobie modyfikowałem dziś kod i użyłem varargs zamiast overload i zacząłem się zastanawiać które jest bardziej koszerne ;-)
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);

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);

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