Wie man lange Konstruktoren vermeidet [duplizieren]

8

Ich habe eine Client-Bibliothek, in der ich Remote-Anrufe an meinen Rest-Service mache und dann List<DataResponse> an den Kunden zurücksende, der unsere Bibliothek mit der Antwort aufruft, die ich von meinem REST-Service bekomme Fehler, wenn irgendwelche um DataResponse -Objekt gewickelt sind.

%Vor%

Hier ist meine ErrorCode enum Klasse:

%Vor%

Und hier ist meine StatusCode enum Klasse:

%Vor%

Wie Sie in meiner DataResponse -Klasse sehen können, habe ich viele Felder, daher habe ich einen sehr langen Konstruktor und jedes Mal, wenn ich ein DataResponse -Objekt mache, habe ich eine große Zeile mit new DataResponse(.......) . In Zukunft könnte ich mehr Felder haben, aber im Moment habe ich nur diese Felder.

Gibt es eine bessere Möglichkeit, ein DataResponse -Objekt zu erstellen und dann List<DataResponse> aus meiner Bibliothek zurückzugeben?

    
john 25.12.2015, 18:33
quelle

3 Antworten

14

Verwenden Sie nicht sofort das Builder-Muster . Es ist nicht für Typen mit Tonnen von erforderlichen Feldern. Es ist für Typen mit Tonnen von optionalen Feldern.

Die erforderlichen Eigenschaften von Builders werden über den Konstruktor angegeben. Sie müssen keine Werte mithilfe von Methoden definieren, wodurch diese Werte optional sind.

Dies lässt Potenzial für Ihr Objekt nur teilweise konstruiert werden . Die Verwendung eines Builders wäre ein Missbrauch des Designs.

Wenn Sie das sagen, sollten Sie Ihren Typ zerlegen . Ich bin nicht sicher, was lmd oder ctime ist oder was wirklich ein DataResponse darstellen soll, also kann ich Ihnen nicht sagen, auf welche Weise Sie zerlegen sollten. Aber ich kann Ihnen sagen, Zusammenhalt ist das, was bestimmt.

isLink , maskInfo und idType könnten möglicherweise in ein DataResponseDetails Objekt zerlegt werden:

%Vor%

Nun könnte Ihr DataResponse sich aus DataResponseDetails zusammensetzen:

%Vor%

Fühlen Sie, dass Ihr Konstruktor noch zu viel braucht? Zerlege mehr!

    
Vince Emigh 25.12.2015, 19:03
quelle
4

Vielleicht können Sie kleinere logische Gruppen von Feldern identifizieren und sie in Objekte einer eigenen Klasse verschieben. Dann können Sie all diese Objekte in Ihren DataResponse -Objekten zusammenstellen.

    
J. Su. 25.12.2015 18:57
quelle
0

Wie Joshua Bloch in Punkt 2 von Effective Java 2nd Edition angegeben hat, sollten Sie ein Builder-Muster verwenden, da dies eine bewährte Methode ist.

Hier sehen Sie, wie Sie mit dem Code aussehen könnten:

%Vor%

und dann etwas wie folgt tun:

%Vor%     
Louis F. 25.12.2015 18:52
quelle

Tags und Links