Oprócz innych świetnych odpowiedzi, istnieje tutaj subtelna przewaga wydajności (oprócz unikania alokacji tablicy), co oznacza, że przeciążenia zera-arg i pojedynczego-arg zwracają implementacje zoptymalizowane do reprezentowania pustych i listy pojedynczych instancji (odpowiednio).
Gdybyśmy nie mają oddzielne przeciążeń metoda te i obejmowała tylko jeden sposób na varargs oparte, to metoda będzie wyglądać mniej więcej tak:
public static <E> ImmutableList<E> of(E... es) {
switch (es.length) {
case 0:
return emptyImmutableList();
case 1:
return singletonImmutableList(es[0]);
default:
return defaultImmutableList(es);
}
}
wykonywaniu przypadku przełącznika (lub jeśli -else checks) nie byłoby złe dla większości wywołań, ale wciąż jest niepotrzebne, ponieważ może mieć przeciążenie metody dla każdej optymalizacji, a kompilator zawsze wie, które przeciążenie wywołać. Nie ma żadnego obciążenia na kod klienta, więc łatwo wygrać.
Wszystkie one przekazują swoje parametry do wewnętrznej metody varargs tak czy inaczej ... huh. Będę musiał podnieść brew na tę. Hmm, źródło ma komentarz "Te idą do jedenastej, po czym dostajesz formę varargs i wszelkie ostrzeżenia mogą się z tym równać. :(" Nie jestem pewien, do czego odnoszą się ostrzeżenia. –
@Tim, to pewnie by dobra odpowiedź, przynajmniej warta i przegłosowana, i prawdopodobnie zaakceptowana odpowiedź: – jjnguy
+1 dla Google za przejście do jedenastu! – romacafe