Provenendo da un background OOP (Java), sto imparando Scala da solo. Mentre posso vedere prontamente i vantaggi dell'utilizzo di oggetti immutabili individualmente, sto avendo difficoltà a vedere come si può progettare un'intera applicazione del genere. Darò un esempio:
Dire che ho oggetti che rappresentano "materiali" e le loro proprietà (sto progettando un gioco, quindi effettivamente ho quel problema), come acqua e ghiaccio. Avrei un "manager" che possiede tutte queste istanze di materiali. Una proprietà sarebbe il punto di congelamento e di fusione, e ciò a cui il materiale si congela o si fonde.
[EDIT] Tutte le istanze del materiale sono "singleton", un po 'come un Java Enum.
Voglio "acqua" per dire che si congela a "ghiaccio" a 0C, e "ghiaccio" per dire che si scioglie in "acqua" a 1C. Ma se l'acqua e il ghiaccio sono immutabili, non possono ottenere un riferimento l'uno all'altro come parametri del costruttore, poiché uno di essi deve essere creato per primo e non si può ottenere un riferimento all'altro non ancora esistente come parametro del costruttore. Potrei risolvere questo dando sia un riferimento al gestore in modo che possano interrogarlo per trovare l'altra istanza materiale di cui hanno bisogno ogni volta che viene loro richiesto per le loro proprietà di congelamento / fusione, ma poi ottengo lo stesso problema tra il manager e i materiali, che hanno bisogno di un riferimento tra loro, ma possono essere forniti solo nel costruttore per uno di essi, quindi il gestore o il materiale non può essere immutabile.
Non è proprio il caso di aggirare questo problema, o devo usare tecniche di programmazione "funzionali" o qualche altro schema per risolverlo?