En plus des autres grandes réponses ici, il y a une subtile les performances d'exécution avantage (en plus d'éviter l'allocation de tableau), qui est que le zéro-arg et unique-arg surcharges retour des implémentations optimisées pour la représentation vide et un seul cas de listes (respectivement).
Si nous n'avions pas de méthode distincte des surcharges de ces et ne comprenaient un seul varargs méthode de base, alors que la méthode devrait ressembler à quelque chose comme ceci:
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);
}
}
Le fonctionnement de l'interrupteur de cas (ou si-sinon vérifie) ne serait pas mauvais pour la plupart des appels, mais il est encore inutile puisque juste avoir surcharges de méthode pour chaque optimisation, et le compilateur sait toujours qui surcharge à l'appel. Il n'y a pas de fardeau placé sur le code du client, c'est donc une victoire facile.