Il team di Java ha fatto moltissimo lavoro rimuovendo gli ostacoli alla programmazione funzionale in Java 8. In particolare, le modifiche alle collezioni java.util fanno un ottimo lavoro nel concatenare le trasformazioni in operazioni in streaming molto veloci. Considerando quanto hanno svolto un buon lavoro aggiungendo funzioni di prima classe e metodi funzionali alle collezioni, perché non hanno completamente fornito collezioni immutabili o persino interfacce di raccolta immutabili?
Senza modificare alcun codice esistente, il team Java potrebbe in qualsiasi momento aggiungere interfacce immutabili uguali a quelle mutabili, meno i metodi "set" e estendere le interfacce esistenti, come questa:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
Certo, operazioni come List.add () e Map.put () attualmente restituiscono un valore booleano o precedente per la chiave data per indicare se l'operazione è riuscita o meno. Le collezioni immutabili dovrebbero trattare tali metodi come fabbriche e restituire una nuova raccolta contenente l'elemento aggiunto, che è incompatibile con la firma corrente. Ma ciò potrebbe essere aggirato usando un nome di metodo diverso come ImmutableList.append () o .addAt () e ImmutableMap.putEntry (). La verbosità risultante sarebbe più che compensata dai vantaggi di lavorare con insiemi immutabili e il sistema di tipi avrebbe evitato errori nel chiamare il metodo sbagliato. Nel tempo, i vecchi metodi potrebbero essere deprecati.
Vittorie di collezioni immutabili:
- Semplicità: ragionare sul codice è più semplice quando i dati sottostanti non cambiano.
- Documentazione - se un metodo prende un'interfaccia di raccolta immutabile, sai che non modificherà quella raccolta. Se un metodo restituisce una raccolta immutabile, sai che non puoi modificarla.
- Concorrenza: le raccolte immutabili possono essere condivise in modo sicuro tra thread.
Come qualcuno che ha assaggiato le lingue che assumono l'immutabilità, è molto difficile tornare al selvaggio West della mutazione dilagante. Le collezioni di Clojure (astrazione di sequenze) dispongono già di tutto ciò che forniscono le raccolte Java 8, oltre all'immutabilità (anche se forse utilizzando memoria e tempo aggiuntivi dovuti a elenchi di collegamenti sincronizzati anziché flussi). Scala ha collezioni sia mutabili che immutabili con un set completo di operazioni, e anche se quelle operazioni sono avide, chiamando .iterator dà una visione pigra (e ci sono altri modi per valutarle pigramente). Non vedo come Java possa continuare a competere senza collezioni immutabili.
Qualcuno può indicarmi la storia o la discussione su questo? Sicuramente è pubblico da qualche parte.