Una buona cosa da fare è guardare la maggior parte delle lingue 'String class. Le stringhe in qualsiasi lingua a cui riesco a pensare sono immutabili, ma la maggior parte delle volte nessuno ha problemi a lavorare con loro. È bello pensare ai modi in cui interagisci con le stringhe e chiediti se puoi lavorare sulla tua classe allo stesso modo.
Ad esempio, se vuoi prendere una stringa e sostituire tutte le istanze di lettere maiuscole con lettere minuscole, c'è un metodo .toLower () o qualcosa di simile che restituisce un nuovo oggetto String che è una copia della vecchia stringa oggetto. La stringa originale rimane la stessa. Puoi fare cose simili con la maggior parte degli oggetti. Diciamo che hai una classe che rappresenta gli eventi per una sede. Al momento, c'è un evento di degustazione Bourbon davvero alla moda che è previsto che scenda giovedì, ma per qualsiasi motivo l'organizzatore dell'evento ha bisogno di cambiare la data dell'evento al venerdì. Sostituisci il vecchio evento con un altro che ha cambiato il campo della data da giovedì a venerdì:
bourbonTasting = bourbonTasting.replaceDate(DAYS.Friday);
Quindi è tutto bello e dandy ora! Qualunque cosa guardi la variabile "bourbonTasting" ora leggerà che è venerdì anziché giovedì.
La cosa che diventa difficile con l'immutabilità, tuttavia, è che dal momento che non hai mutato l'originale, qualsiasi altra cosa che stava memorizzando una copia del vecchio evento deve essere aggiornata. Ora immagina ci sono un sacco di calendari là fuori che hanno questo evento su di loro. Se tutti avessero un riferimento all'oggetto originale e l'oggetto originale fosse mutabile, questi calendari non avrebbero bisogno di essere aggiornati perché l'oggetto a cui puntavano avrebbe solo il nuovo valore. Ciò pone tuttavia molti problemi con la concorrenza, poiché se qualcosa sta guardando quel calendario e qualcosa sull'evento cambia a metà strada, la persona che consuma quel calendario potrebbe essere lasciata in uno stato incoerente. Questi sono gli effetti collaterali di mutare quell'oggetto.
Poiché il nostro ipotetico evento di calendario è immutabile, non dobbiamo preoccuparci di cambiare le cose da persone senza che se ne accorgano, ma quello di cui dobbiamo preoccuparci è come aggiornare tutti questi calendari. In questo caso, sarebbe opportuno che la persona "iscriva" il proprio calendario all'evento. Quando l'evento cambia, un nuovo evento può essere trasferito su quei calendari. Se anche quei calendari sono immutabili, allora dovranno essere ricreati con il nuovo evento che sostituirà anche quello vecchio. Se l'elenco degli iscritti all'evento è immutabile, è necessario creare un nuovo elenco di abbonati ogni volta che qualcuno si iscrive di nuovo.
Come puoi vedere, avere tutto essere immutabile può ripulire i problemi di concorrenza, ma può anche diventare costoso. Puoi finire per dover creare molti nuovi oggetti solo perché una piccola cosa è cambiata. La chiave per usare bene l'immutabilità è sapere quando usarla e quando no. L'oggetto evento è un dettaglio molto pubblico e averlo immutabile è probabilmente buono, in modo da non cambiare le cose da persone. L'elenco degli abbonati per l'evento può essere tenuto privato dell'evento o dell'organizzatore dell'evento, quindi potrebbe essere sensato tenerlo mutabile in modo che non si stia facendo una quantità pazzesca di ricreazione degli oggetti se si ha un evento caldo . I calendari delle persone che stanno pianificando di partecipare all'evento potrebbero andare in entrambi i modi, a seconda di cos'altro viene utilizzato per i calendari.
È una di quelle cose in cui devi essere attento a prestare attenzione sia alla creazione dell'oggetto che alle conseguenze del cambiamento e prendere una decisione razionale basata sul bilanciamento di questi due fattori. Se sarà costoso continuare a creare nuovi oggetti e non sarebbe difficile gestire chi guarda gli oggetti, potrebbe essere meglio mantenerlo mutabile. Se la chiave sta evitando effetti collaterali e / o la creazione dell'oggetto non sarà relativamente costosa, dovrebbe probabilmente essere immutabile.
Quindi, se ti imbatti in situazioni in cui hai difficoltà con l'immutabilità, prima assicurati di pensare correttamente all'immutabilità. Pensaci come String, e come agisci su quello. Se stai già lavorando in quel giusto modello mentale, allora è il momento di iniziare a chiedersi se l'immutabilità è la cosa giusta da fare. Se creare e sostituire oggetti è doloroso, forse l'immutabilità non è adatta a quel particolare caso.