Oltre alle altre grandi risposte qui, c'è un sottile vantaggio in termini di prestazioni in runtime (oltre a evitare l'allocazione dell'array), ovvero che gli overload di zero-arg e single-arg restituiscono implementazioni ottimizzate per rappresentare vuoti e liste di istanze singole (rispettivamente).
Se non avessimo sovraccarichi metodo separate per questi e comprendevano solo un singolo metodo varargs-based, quindi questo metodo sarebbe simile a questa:
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);
}
}
La performance del caso interruttore (o se -else checks) non sarebbe male per la maggior parte delle chiamate, ma non è ancora necessario poiché può solo avere overload di metodi per ogni ottimizzazione, e il compilatore sa sempre quale sovraccarico chiamare. Non c'è nessun peso sul codice cliente, quindi è una vittoria facile.
fonte
2012-09-01 15:35:31
E tutti passano comunque i loro parametri a un metodo varargs interno ... eh. Dovrò alzare un sopracciglio a questo. Hmm, la fonte ha un commento "Arrivano fino a undici. Dopo di ciò, ottieni il modulo varargs e gli eventuali avvertimenti potrebbero venire con esso. :(". Non sono sicuro di quali avvertimenti si riferisca a, comunque. –
@Tim, questo probabilmente farebbe una buona risposta, vale la pena almeno e upvote, e probabilmente la risposta accettata – jjnguy
+1 per Google per arrivare fino a undici! – romacafe