Frage

Ich bin für einige effiziente Art und Weise der Suche nach einer unveränderlichen Klasse bauen, so wie Java String-Klasse.

War es hilfreich?

Lösung

  1. Alle Felder müssen private und vorzugsweise final
  2. die Klasse Stellen Sie sicher, kann nicht sein, außer Kraft gesetzt - die Klasse final machen, oder statische Fabriken verwenden und halten Konstruktoren privat
  3. Felder müssen von der ausgefüllt werden Constructor / Fabrik
  4. Sie bieten keine Setter für die Felder
  5. Achten Sie auf Sammlungen. Verwenden Collections.unmodifiable*. Auch Sammlungen sollten nur unveränderliche Objekte enthalten
  6. Alle Getter müssen liefern oder unveränderliche Objekte verwenden defensive Kopieren
  7. 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top