Ich habe gelesen und heard eine Menge guter Dinge über immutability, also habe ich beschlossen, es in einem meiner Hobby-Projekte auszuprobieren. Ich habe alle meine Felder als schreibgeschützt deklariert und alle Methoden gemacht, die normalerweise ein Objekt mutieren würden, um eine neue, modifizierte Version zurückzugeben.Wie implementiere ich Caching auf unveränderliche Weise?
Es funktionierte großartig, bis ich in eine Situation kam, in der eine Methode durch externes Protokoll eine bestimmte Information über ein Objekt zurückgeben sollte, ohne sie zu modifizieren, aber gleichzeitig durch Modifikation der internen Struktur optimiert werden konnte. Dies geschieht insbesondere mit tree path compression in einem union find algorithm.
Wenn der Benutzer int find(int n)
aufruft, erscheint das Objekt für den Außenstehenden unverändert. Es stellt die gleiche Entität konzeptionell dar, aber die internen Felder sind mutiert, um die Laufzeit zu optimieren.
Wie kann ich das auf unveränderliche Weise implementieren?
Ich würde sagen, dass, wenn Sie die Mutation in einer thread-sicheren Weise tun, und es von einem Außenseiter nicht nachweisbar ist, dann kann es als unveränderlich angesehen werden. – Joe
@Joe aber so muss ich die Fadensicherheit selbst beibehalten. Die Schönheit der Unveränderlichkeit, so wie ich sie verstehe, ist die Tatsache, dass ich es der Sprache überlassen kann, indem ich nur das Schlüsselwort readonly festlege. –
aber Sie haben gesagt, dass Sie es mutieren wollen. Wenn Sie dies nicht thread-sicher tun, verlieren Sie einen der Vorteile eines unveränderlichen Typs (Thread-Sicherheit). – Joe