2012-11-29 7 views
12

So che questa domanda è stata fatta prima che il generico esca. Array ha un po 'di vantaggio dato che Array impone il tipo di ritorno, è più sicuro per i tipi.Best practice per la progettazione dell'API Java 7 - Restituire Array o restituire Raccolta

Ma ora, con l'ultimo JDK 7, ogni volta quando ho progettare questo tipo di API:

public String[] getElements(String type) 
vs 
public List<String> getElements(String type) 

Sono sempre lottando per pensare ad alcune buone ragioni per restituire un insieme su un array o in un altro modo per aggirare . Qual è la migliore pratica quando si tratta del caso di scegliere String [] o List come tipo di ritorno dell'API? O sono i corsi per i cavalli.

Non ho un caso particolare nella mia mente, sono più alla ricerca di un confronto pro/contro generico.

+2

Hai in mente un caso particolare? Dipende davvero da cosa esattamente si vuole, ognuno ha i suoi vantaggi e svantaggi – amit

+0

No, sto più cercando un confronto generico, come nel caso in cui Array funziona meglio, e in questo caso le Collezioni vincono, le ragioni di coz. – Shengjie

+2

Non riesco a pensare a nessun caso in cui preferirei un array su una collezione, tranne in situazioni in cui è necessaria una grande prestazione (quindi quasi mai). – Pablo

risposta

8

Ecco una lista parziale

Vantaggi di serie:

  • veloci
  • Mutevole per natura
  • Sapete esattamente "quello che si ottiene" (qual è il tipo) - quindi sai esattamente come si comporterà l'oggetto restituito.

Vantaggi di lista:

  • comportamento varia a seconda del tipo effettivo restituiti (per esempio - può essere mutabile o immutabile a seconda del tipo effettivo)
  • disegno
  • Meglio hirerchy
  • (A seconda del tipo effettivo) potrebbe essere la dimensione dinamica
  • Più intuitivo hashCode(), equals() - che potrebbe essere fondamentale se il feed in una raccolta basata su hash come chiave.
  • Tipo di sicurezza:

    String[] arr1 = new String[5]; 
    Object[] arr2 = arr1; 
    arr2[0] = new Object(); //run time error :(
    List<String> list1 = new LinkedList<String>(); 
    List<Object> list2 = list1; //compilation error :) 
    
+2

Si noti che, a causa della covarianza dei tipi di array , non sono abbastanza typesafe Dichiara 'void setFirst (Object [] xs, Object x);' e chiama 'setFirst (new Integer [2]," a ")', compila. –

+0

@MarkoTopolnik: ho provato ad indicarlo (in una modifica pochi minuti fa) come un vantaggio di lista con un esempio semplificato – amit

+0

Sì, capisco. Sembra che ho trascurato quel punto.Il punto si distingue meglio quando usiamo la dichiarazione di metodo e l'invocazione per l'esempio –

12

Se si sta scrivendo un'API pubblica, i client di solito preferiscono le raccolte perché sono più facili da manipolare e integrare con il resto della base di codici. D'altra parte, se si prevede che l'API pubblica venga utilizzata in un contesto altamente sensibile alle prestazioni, è preferibile l'array raw.

Se si sta scrivendo questo per uso personale, sarebbe una buona pratica iniziare con un tipo di raccolta e passare a un array solo se esiste un problema di prestazioni definito che lo coinvolge.

Il tipo di elemento di una matrice può essere determinato in fase di runtime tramite riflessione, quindi se quella particolare caratteristica è importante per te, sarebbe un altro caso preferire una matrice.

2

Se ho una scelta avrei selezionare la raccolta a causa del comportamento aggiunto ricevo per 'libero' in Java.

Implementare alle interfacce

Il più grande vantaggio è che se si torna l'API Collection (o anche un elenco, Set, ecc) è possibile modificare facilmente l'implementazione (per esempio ArrayList, LinkedList, HashSet, ecc) senza bisogno di cambiare i client usando il metodo.

calcolata problem

La classe Java Collections fornisce molte involucri che possono essere applicati a una raccolta compreso

  1. Sincronizzazione una raccolta
  2. effettuare una raccolta immutabile
  3. Ricerca, retromarcia, ecc ...
0

Quando si espone un'API pubblica ha molto senso restituire una raccolta, poiché rende la vita più semplice per il client utilizzando tutti i tipi di metodi disponibili su di essa. Il client può sempre chiamare toArray() se desidera una rappresentazione di array per casi speciali.

Anche l'integrazione con altri moduli diventa più semplice poiché la maggior parte delle API si aspetta la raccolta in modo che possa funzionare anche.

0

Dal mio punto di vista, dipende da cosa verrà utilizzato il valore restituito.

Se il valore restituito verrà iterato e nient'altro, una matrice è la scelta migliore ma se il risultato verrà manipolato, andare alla raccolta appropriata.

Ma attenzione perché, per esempio, List dovrebbe consentire duplicati mentre Set non dovrebbe, Stack deve essere LIFO mentre Coda dovrebbe essere FIFO e notare la DOVREBBE che uso perché solo l'implementazione in grado di determinare il comportamento reale.

In ogni caso, dipende davvero.

Problemi correlati