As per this link
Visto che la regola n. 1 è orribile, vorrei mettere in guardia dal prendere il resto del post sul blog come legge. Anche se in realtà, nessun post sul blog dovrebbe essere considerato come legge.
E la citazione stessa è piuttosto contraddittoria:
- A good object should never change his encapsulated state.
- Be aware that immutability doesn't mean that all methods always return the same values.
Ecco la cosa, se hai uno stato immutabile e i tuoi metodi restituiscono valori diversi, allora almeno una delle due cose è vera:
- La tua funzione varia in base ai suoi input.
- La tua funzione ha effetti collaterali (funziona con qualcosa che ha ha uno stato mutabile).
(L'esempio nell'articolo colpisce su # 2.)
La seconda di queste condizioni sconfigge lo scopo di avere oggetti immutabili, e fare la distinzione tra "stato incapsulato" e altri stati è nel peggiore dei casi, nel migliore dei casi poco pratico.
E la prima di queste condizioni è buona. Le funzioni dovrebbero variare solo sui loro input ove possibile. Nascondere lo stato immutabile nella classe nuoce un pochino al fronte della chiarezza, ma varia molto in base a ciò che stai effettivamente facendo.
Comunque, alla tua domanda:
Without performance overheads, can such implementations(class LinkedList) be introduced by instantiating as immutable objects?
Dipende dalla tua lingua / implementazione. Le liste collegate si prestano abbastanza bene alla costruzione immutabile perché le parti interne di ciascun "link" non sono realmente mutabili. È relativamente facile creare nuovi collegamenti con nuovi indicatori.
In Java, dubito che potresti fare cose del genere senza un sovraccarico dovuto al colpo al garbage collector. Non si può nemmeno fare il pooling di oggetti poiché non c'è modo di riutilizzare gli oggetti immutabili in modo affidabile. E certamente non potresti farlo mantenendo le interfacce Java esistenti, progettate con la mutabilità (e mantenendo un riferimento alla lista) in mente.
Does a good object never change its state?
Un tale assoluto non è corretto. Sì, l'immutabilità offre numerosi vantaggi. Sì, probabilmente dovresti avere l'impostazione predefinita per rendere i tuoi oggetti immutabili in Java e in molte altre lingue. Ma ci sono molti oggetti perfettamente validi che cambiano il loro stato, e non alcuni oggetti (soprattutto le collezioni) in cui l'oggetto mutevole è di gran lunga migliore (più utilizzabile, più robusto, più performante, più flessibile, più manutenibile) di un design immutabile.