Ich liebe das unveränderliche "Muster" aufgrund seiner Stärken und in der Vergangenheit fand ich es vorteilhaft, Systeme mit unveränderlichen Datentypen (einige, die meisten oder sogar alle) zu entwerfen. Wenn ich das tue, schreibe ich oft weniger Fehler und das Debuggen ist viel einfacher.
Allerdings scheuen meine Kollegen im Allgemeinen unveränderlich. Sie sind überhaupt nicht unerfahren (weit davon entfernt), aber sie schreiben Datenobjekte auf klassische Weise - private Mitglieder mit einem Getter und einem Setter für jedes Mitglied. Normalerweise nehmen ihre Konstruktoren dann keine Argumente oder nehmen aus Bequemlichkeitsgründen nur einige Argumente. So oft sieht das Erstellen eines Objekts so aus:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
Vielleicht machen sie das überall. Vielleicht definieren sie nicht einmal einen Konstruktor, der diese beiden Zeichenfolgen verwendet, egal wie wichtig sie sind. Und vielleicht ändern sie den Wert dieser Saiten später nicht und müssen es auch nie. Klar, wenn diese Dinge wahr sind, wäre das Objekt besser als unveränderlich zu gestalten, oder? (Der Konstruktor übernimmt die beiden Eigenschaften, überhaupt keine Setter.)
Wie entscheiden Sie, ob ein Objekttyp unveränderlich gestaltet werden soll? Gibt es eine Reihe guter Kriterien, nach denen man es beurteilen kann?
Ich überlege derzeit, ob ich einige Datentypen in meinem eigenen Projekt auf unveränderlich umstellen soll, aber ich müsste es meinen Kollegen gegenüber rechtfertigen, und die Daten in den Typen könnten sich (sehr selten) ändern - zu welchem Zeitpunkt können Sie sich natürlich ändern auf unveränderliche Weise (erstellen Sie ein neues Objekt und kopieren Sie die Eigenschaften des alten Objekts, mit Ausnahme derjenigen, die Sie ändern möchten). Aber ich bin mir nicht sicher, ob dies nur meine Liebe zu Unveränderlichen ist oder ob es einen tatsächlichen Bedarf gibt, von ihnen zu profitieren.