Come sottolinea @MetaFight, add
e addAll
hanno semantica diversa. Ma c'è anche una prospettiva storica per il design dell'API Collection
.
Il framework Collections è stato aggiunto a Java prima che supportasse i tipi generici. In quei giorni, l'API per la raccolta definiva i metodi come segue:
boolean add(Object e) // adds a single element
boolean addAll(Collection c) // adds all elements in the collection
Ora immagina che abbiano progettato l'API in questo modo:
boolean add(Object e) // adds a single element
boolean add(Collection c) // adds all elements in the collection
e qualcuno ha scritto questo:
List list = new ArrayList();
Object list2 = new ArrayList();
List list3 = new ArrayList();
list3.add(list);
list3.add(list2);
Domanda: cosa dovrebbe ora list3? Risposta: una lista vuota.
Confusione ... non è vero? Ma questo illustra chiaramente il pericolo di avere sovraccarichi che fanno cose sostanzialmente diverse.
Ora da Java 5, dovresti (dovresti) dichiarare gli elenchi con tipi parametrizzati (non i tipi non elaborati) e l'esempio sopra (ipotetico) molto probabilmente ti darebbe errori di compilazione. Ma, ricorda, le collezioni sono state introdotte qualche anno prima dei tipi generici. Anche se volessero rinominare addAll
come sovraccarico di add
, non avrebbero potuto farlo senza rompere la compatibilità binaria.
I can't imagine it makes any practical difference.
Lo fa. Vedere l'esempio sopra ... per un'illustrazione del principio generale.
So, my conclusion is to only overload when there is strong, logical, reason to do so. Overloading just because I can is discouraged?
Sì, e sì. Ma anche, dovresti sovraccaricare quando i metodi essenzialmente la stessa cosa .