Mögliche Wege, um ein Objekt unveränderlich
-
06-07-2019 - |
Frage
Ich bin für einige effiziente Art und Weise der Suche nach einer unveränderlichen Klasse bauen, so wie Java String-Klasse.
Lösung
- Alle Felder müssen
private
und vorzugsweisefinal
- die Klasse Stellen Sie sicher, kann nicht sein, außer Kraft gesetzt - die Klasse final machen, oder statische Fabriken verwenden und halten Konstruktoren privat
- Felder müssen von der ausgefüllt werden Constructor / Fabrik
- Sie bieten keine Setter für die Felder
- Achten Sie auf Sammlungen. Verwenden
Collections.unmodifiable*
. Auch Sammlungen sollten nur unveränderliche Objekte enthalten - Alle Getter müssen liefern oder unveränderliche Objekte verwenden defensive Kopieren
- bieten keine Methoden, die ändert den internen Zustand des Objekt.
Tom Hawtin darauf hingewiesen, dass final
optional sein kann. String
class
verfügt über einen Cache hash
var, die nur zugewiesen, wenn die Hash-Funktion aufgerufen wird.
Andere Tipps
Wenn Sie alle Felder bevölkern den Konstruktor und die Felder final machen -. Sie sind da partway
Wenn die Felder benutzerdefinierte Typen verwenden -. Sie können auch sie unveränderlich müssen machen
Felder, die Sammlungen sind, sollen die unveränderbaren Sammlungen verwenden -. Auf der sicheren Seite sein
Sie müssen über das Objekt Diagramm sorgen!
Jede Methoden für das Objekt müssen mit nicht-final Felder kümmern. Z.B. String.add schafft eine neue String. Wenn Sie ein Feld mutieren müssen -., Tun dies über eine Copykonstruktor
Schließlich das Objekt endgültig machen.
Ein Objekt ist unveränderlich, wenn keines der Felder verändert werden können, so müssen diese Felder final
werden. Wenn Sie nicht möchten, dass Ihr Objekt subclassed werden, können Sie die Klasse selbst auch machen final
, wie String ist.
Um leicht ein unveränderliches Objekt mit vielen Informationen zu konstruieren, sollten Sie die Factory-Muster schauen
Weitere Informationen finden Sie unter Wikipedia