Java: Alternative zur Übergabe von "this" als Konstruktorargument, um auf ein erstellendes Objekt zu verweisen

8

Ich habe einige Zeit damit verbracht, über verschiedene Lösungen nachzudenken, von denen ich ausgegangen bin (ich bin noch nicht wirklich mit Java vertraut), dass die Verwendung eines Konstruktorarguments normalerweise keine gute Übung ist.

Was ich versuche ist, mehrere Objekte der Klasse JobGroupMod zu instanziieren und für jedes JobGroupMod muss ich eine bestimmte Anzahl von JobMod-Objekten erstellen, die in der Lage sein müssen, auf die JobGroupMod-Objekte zurückzugreifen, aus denen sie erzeugt wurden.

Um das zu bewerkstelligen, gebe ich "das" an den JobMod-Konstruktor weiter, aber selbst wenn ich arbeite, fühlte es sich nicht nach richtigem Design an.

%Vor%

Und jetzt die JobMod-Klasse:

%Vor%

Meine Frage ist, gibt es einen besseren Weg, dies zu lösen, oder ist meine Lösung der vorgeschlagene Weg?

    
wallen 24.12.2012, 16:59
quelle

3 Antworten

7

Sie sollten versuchen, eine statische Factory-Methode zu verwenden ( Effektiver Java-Link ). .

Auf diese Weise vermeiden Sie es, this in einem Konstruktoraufruf zu übergeben, was gelinde gesagt sehr schlecht ist.
Beispielcode:

%Vor%     
Gal 24.12.2012, 17:11
quelle
4

Solange es so bleibt, ist das einzige, was Sie im JobGroupMod -Konstruktor tun, fair , solange Sie die Konsequenzen verstehen. In der realen Welt gibt es viel Java-Code, der das tut. Es ist immer noch nicht etwas, was Sie wirklich tun möchten, besonders wenn Sie anfangen über Multithreading und Parallelität zu sprechen.

Die Gefahr gibt this an etwas anderes weiter, bevor ein Objekt vollständig konstruiert ist. Wenn der Konstruktor eine Exception werfen würde, nachdem Sie dies getan haben und nicht vollständig konstruieren, könnten Sie ein unangenehmes Problem haben. Wenn ein anderer Thread auf das Objekt zugreifen würde, dem Sie this übergeben haben, bevor es vollständig erstellt wurde, haben Sie ein unangenehmes Problem.

Was Sie oft in Java finden, sind Leute, die ein Factory-Muster verwenden, um dies zu vermeiden, eine "Init" -Typ-Methode oder die Abhängigkeitsinjektion.

    
Brian Roach 24.12.2012 17:09
quelle
0

Im Allgemeinen gibt es keine Magie. Sie können Parameter entweder über Konstruktor übergeben oder später mit der Methode set / init usw. initialisieren.

Wenn Ihre Klasse JobMod einen Verweis auf JobGroupMod benötigt und ohne sie nichts zu tun hat, übergeben Sie sie mit dem Konstruktor. Wenn es manchmal ohne es stehen kann, erstellen Sie init() Methode oder Setter, die diese Referenz initialisieren können.

BTW Manchmal müssen Sie sowohl den parametrisierten als auch den Standardkonstruktor erstellen: Erstens für die normale Verwendung von Programmen, zweitens, wenn Sie XML, JSON oder eine andere Serialisierung verwenden, die für Bean-ähnliche Klassen einfacher ist. In diesem Fall erstellen Sie mindestens javadoc, das erklärt, dass der Standardkonstruktor nicht direkt verwendet werden sollte.

    
AlexR 24.12.2012 17:07
quelle

Tags und Links