Warum sollte der Builder eine statische innere Klasse sein?

8

Ich bin mir ziemlich bewusst über Builder-Muster. Auch schon mit dem Builder-Muster, das in Punkt # 2 in effektivem Java von Joshua Bloch beschrieben wird, durchgegangen.

Hier ist meine Frage - Gibt es bestimmte Vorteile, um die Builder-Klasse in der Klasse zu halten, die instanziiert?

Wir können auch die Builder-Klasse trennen und dasselbe tun.

Bitte seien Sie spezifisch mit Ihren Antworten. WIE ich bereits weiß, dass innere Klasse auf private Mitglieder der Bauklasse und all dies zugreifen kann.

    
Bhavesh Dangi 23.07.2015, 06:03
quelle

3 Antworten

12

Sie wissen offensichtlich bereits, dass eine geschachtelte Klasse (ob statisch oder nicht) auf private Mitglieder der umgebenden Klasse zugreifen kann.

Die wirkliche Frage ist also:

Welches Mitglied ist es wert, privat zu sein und von einem Builder darauf zuzugreifen?

Und die Antwort ist ... der Konstrukteur! Sie möchten den Konstruktor privat machen, um überhaupt keinen Zugriff zuzulassen. Sie möchten stattdessen den Zugriff auf den Builder zulassen, aber der Builder muss den Konstruktor irgendwann aufrufen, um ... nun ... ihn zu erstellen.

Wenn Sie einen Builder haben, der nicht geschachtelt ist - vielleicht eine Klasse der obersten Ebene -, müssen Sie den Konstruktor der Zielklasse mindestens package-privat machen. Und das ist normalerweise nicht erwünscht.

Fazit: Der Builder sollte eine geschachtelte Klasse sein.

Oh, und die Antwort von Davide Lorenzo MARINO ist auch wahr: Natürlich ist es auch die starke Beziehung des Erbauers und seiner umgebenden Klasse.

    
Seelenvirtuose 23.07.2015 06:12
quelle
8

Erstens: Es wird als innere -Klasse definiert, da es stark mit der äußeren Klasse zusammenhängt. Von der Oracle Website :

  

Es ist eine Möglichkeit, Klassen logisch zu gruppieren, die nur in einem verwendet werden   place : Wenn eine Klasse nur für eine andere Klasse nützlich ist, dann ist es das   logisch, es in diese Klasse einzubetten und die beiden zusammen zu halten. Verschachteln   Solche "Hilfsklassen" machen ihr Paket schlanker.

Zweitens: Es wird als statisch definiert, da die innere Klasse nicht statisch ist, wenn Sie sie nicht erstellen, ohne eine Instanz der äußeren Klasse zu erstellen.

Als zusätzliches nettes Verhalten können Sie den Konstruktor der äußeren Klasse private definieren. Daher ist es nicht möglich, die äußere Klasse ohne expliziten Aufruf des Builders zu erstellen.

Und mehr, wie von JB Nizet in den Kommentaren der Frage angegeben, ist es einfacher, den Builder im Javadoc zu finden, der nach der äußeren Klasse sucht.

    
Davide Lorenzo MARINO 23.07.2015 06:05
quelle
2

Ich denke, es gibt zwei Gründe dafür.

  1. Der Builder kann auf die privaten Daten der äußeren Cass zugreifen, so dass kein Setter benötigt wird, auf den andere zugreifen können. - Ich weiß, dass du es bereits weißt.
  2. Der Name der Builder-Klasse lautet the-package.Something.Builder , was selbsterklärend ist und das Paket nicht mit so vielen Klassen zusammenfasst.

Nur meine zwei Cent.

    
NawaMan 23.07.2015 06:11
quelle

Tags und Links