Durante la scrittura di un'API in Java, restituendo una raccolta immutabile di qualche tipo, ho la possibilità di restituire Collection
(o List
, Map
, ecc.) dal metodo o% gude% di guava (o ImmutableCollection
, ImmutableList
, ecc.):
private final ImmutableMap<> _immutableMap = ...
public Collection<T> getValues() {
return _immutableMap.values();
}
o
public ImmutableCollection<T> getValues() {
return _immutableMap.values();
}
Quale è meglio?
L'impostazione del valore di ritorno come ImmutableMap
mi impone di usare quel tipo esatto per sempre, in modo che non possa scambiare ImmutableCollection
per il mio tipo immutabile in seguito che restituisce, diciamo, una visualizzazione immutabile dei valori che isn _immutableMap
(la costruzione di una richiede la copia dei valori, e non posso creare una sottoclasse per fornire una vista immutabile di una collezione mutevole).
Ma c'è un vantaggio per le persone che chiamano il metodo per vedere che il valore di ritorno è effettivamente immutabile e hanno i metodi t an ImmutableCollection
e add
contrassegnati come deprecati, piuttosto che provare ad aggiungere o rimuovere elementi e farlo fallire in fase di runtime .
In generale, mi piace restituire il tipo di interfaccia più specifico da un metodo, in modo da poter modificare l'implementazione sottostante in seguito, se necessario, senza interrompere il contratto. Ma c'è un vantaggio per i chiamanti che restituiscono un remove
, al costo di limitare lo sviluppo futuro del metodo e causare futuri possibili problemi di prestazioni dovuti alla copia di tutti i valori in un ImmutableCollection
invece di fornire una vista immutabile.