Nel lungo dibattito sull'uso di matrici contro liste nelle classi pubbliche API di Java, tendo a preferire le liste nella maggior parte delle situazioni. Tuttavia, ho anche trovato utile usare gli argomenti var in molti costruttori e metodi, che richiedono di dichiarare un argomento del metodo (l'ultimo) come una matrice (aggiungendo implicitamente "..." prima del nome del parametro).
Dato che in molti di questi metodi desidero fornire a un programmatore la possibilità di o elencare esplicitamente gli argomenti (con var args) o utilizzare una raccolta predefinita quando si richiama il metodo, io spesso finisce per definire un costruttore o un metodo con argomenti var, e una versione sovraccaricata che accetta un elenco invece dell'array var args. Ad esempio:
public void myMethod(X ...items) {
myMethod(Arrays.asList(items));
}
private void myMethod(List<X> items) {
...
}
So che in teoria non ho bisogno di sovraccaricare il metodo sostituendo l'array var args con una lista se voglio che il programmatore invii una collezione di oggetti. Poteva semplicemente inviare un array.
Il motivo per cui faccio spesso questo è perché la maggior parte (se non tutti) dei metodi nella mia API usano liste invece di matrici, ed è un po 'strano che per uno o due metodi che richiedono la raccolta di oggetti, il programmatore deve lavorare con gli array (nei casi in cui gli argomenti var non sono convenienti). Quindi fornisco una versione sovraccaricata che funziona con l'elenco per coerenza.
Tuttavia, poiché questo è un problema ricorrente, ho la spiacevole sensazione di scrivere troppo spesso il codice boilerplate. Vorrei ricevere un feedback se la mia motivazione di mantenere la mia interfaccia coerente (accettando var array o liste, ma non costringendo il programmatore a lavorare con gli array se non proprio necessario) è sufficiente per continuare a scrivere versioni sovraccaricate usando le liste per la maggior parte dei miei metodi requirying var argument.
Vorrei sottolineare che so che per alcuni metodi gli array potrebbero essere più convenienti degli elenchi. La mia domanda riguarda situazioni in cui l'unica motivazione per dichiarare l'ultimo argomento del metodo come matrice è perché in alcuni scenari l'uso di argomenti var può essere conveniente.
Aggiorna
Grazie per il tuo feedback. Le mie conclusioni al momento sono le seguenti:
- Riduci il più possibile l'uso di var args.
- Continua ad aggiungere una versione sovraccaricata del metodo con var args, ad esempio l'argomento dell'array viene sostituito da un elenco (o un
Iterable
, come sottolineato da @Kevin), nei casi in cui può essere utile avere la scelta per invocare il metodo con var args o con una raccolta. - Interrompi l'utilizzo di Java il prima possibile :) (Lo sapevo già)