Builder-Muster-Validierung - Effektiv Java
In Artikel 2 der Effektive Java (2nd Edition), der Autor nennt folgende über imposante Invarianten über Parameter, die während der Verwendung Bauherren:
Ist es wichtig, dass Sie überprüft werden nach kopieren der Parameter aus dem builder-Objekt, und, dass Sie überprüft werden auf die Objekt-Felder anstelle der Baumeister Felder (Item 39). Wenn keine der Invarianten verletzt werden, die build-Methode sollte wirft eine IllegalStateException (Item 60).
Bedeutet dies, dass nach dem build-Methode hat das Ziel-Objekt übergeben werden sollen, eine Validierungs-routine für alle erforderlichen Validierungen?
Auch, könnte jemand bitte erläutern Sie die Argumentation dahinter?
- Ich nehme an, weil der generator die Felder werden könnte, mutiert (z.B. durch einen anderen thread), nachdem Sie kopiert worden sind, auf das Objekt, was bedeutet, dass der Bauherr könnte in einem Zustand, wo es schaffen würde, eine "gültige" Objekt, während Sie vorher hätte eine "ungültig" - Objekt.
- Tut mir Leid, aber ich bin mir nicht sicher, ob ich diese richtig verstehen. Ein generator erstellt werden, wie neue <ClassName>.Builder.setter1().setter2.().build(). Wie könnte einer einen anderen thread Verweis für diese Besondere generator-Objekt?
- In diesem Fall, es konnte nicht. Aber es gibt nichts zu stoppen Sie eine builder-Instanz geteilt zwischen threads im Allgemeinen: es ist nur ein Bezug wie der andere.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Objekt validation ist integraler Bestandteil der Objekt-Erstellung mit Bauherren. Sie können zwar eine separate routine tun, die überprüfung, eine solche Trennung ist nicht erforderlich: Validierung code kann einen Teil der Funktion zu tun die bauen. In anderen Worten, Sie können dies tun,
oder so:
Wichtig ist, dass die Validierung erfolgt nach, nicht vor, den Bau des Zielobjekts. In anderen Worten, müssen Sie überprüfen den Zustand des Objekts, nicht der Staat der Bauherr.
Des Baumeisters
build()
Methode in der Regel fordert der private Konstruktor der Klasse Gebäude. Das ist, warum Bauherren sind in der Regel umgesetzt als statische verschachtelte Klassen, so dass Sie Zugriff auf den private-Konstruktor. Der Konstruktor ist, in denen die Validierung stattfindet. Auch wenn Sie nicht mit dem builder-Muster, Konstruktoren sind dafür verantwortlich, dass sich das Objekt in einem gültigen Zustand, wenn es erstellt wird. Und der Konstruktor erstellen sollte, defensive Kopien (EJ Punkt 39), und validieren Sie die neue Objekt-Felder, nicht der Erbauer der Felder, da die builder konnte, mutiert, während die Felder kopiert werden.