Ho un oggetto che memorizza alcuni dati in una lista. L'implementazione potrebbe cambiare in seguito e non voglio esporre l'implementazione interna all'utente finale. Tuttavia, l'utente deve avere la possibilità di modificare e accedere a questa raccolta di dati. Attualmente ho qualcosa di simile:È meglio usare Elenco o Raccolta?
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
questo significa che ho lasciato i dettagli di implementazione interna di fuoriuscire? Dovrei farlo invece?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
Una cosa da tenere a mente è che se si restituisce la raccolta o l'elenco effettivo in questo modo, si consente a qualcun altro di fare tutto ciò che desidera, incluso l'eliminazione di elementi o addirittura la cancellazione dell'intera faccenda. Potrebbe essere meglio restituire un wrapper non modificabile o una copia dell'elenco. –
@PaulTomblin true, ma è un overhead eccessivo e artificiale per il sistema. I wrapper non modificabili hanno senso quando si lavora con oggetti gestiti dal middleware di persistenza, e anche solo in rari casi. – comeGetSome
@comeGetSome, è per questo che ho detto "può" piuttosto che "deve". Dipenderebbe dal caso d'uso: se dovessi creare un'API per altri utenti, restituirei una copia o un wrapper. Se fosse per me o per i colleghi di fiducia, metterei un grande "NON MODIFICARE QUESTO VALORE" nei javadoc e lascialo fare a quello. –