Verwalten von Konstruktoren mit vielen Parametern in Java
Das Builder Design Pattern könnte helfen. Betrachten Sie das folgende Beispiel
public class StudentBuilder
{
private String _name;
private int _age = 14; // this has a default
private String _motto = ""; // most students don't have one
public StudentBuilder() { }
public Student buildStudent()
{
return new Student(_name, _age, _motto);
}
public StudentBuilder name(String _name)
{
this._name = _name;
return this;
}
public StudentBuilder age(int _age)
{
this._age = _age;
return this;
}
public StudentBuilder motto(String _motto)
{
this._motto = _motto;
return this;
}
}
Dadurch können wir Code wie
schreibenStudent s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
.name("Spicoli")
.age(16)
.motto("Aloha, Mr Hand")
.buildStudent();
Wenn wir ein erforderliches Feld weglassen (vermutlich ist ein Name erforderlich), kann der Student-Konstruktor eine Ausnahme auslösen. Und er lässt uns standardmäßige/optionale Argumente haben, ohne die Reihenfolge der Argumente verfolgen zu müssen, da jede Reihenfolge von diesen Anrufe funktionieren genauso gut.
Können Sie verwandte Parameter in einem Objekt kapseln?
z. B. wenn Parameter wie
sind
MyClass(String house, String street, String town, String postcode, String country, int foo, double bar) {
super(String house, String street, String town, String postcode, String country);
this.foo = foo;
this.bar = bar;
dann könnten Sie stattdessen haben:
MyClass(Address homeAddress, int foo, double bar) {
super(homeAddress);
this.foo = foo;
this.bar = bar;
}
Was Sie wahrscheinlich tun möchten, ist eine Builder-Klasse. Dann würden Sie etwa so vorgehen:
MyObject obj = new MyObjectBuilder().setXxx(myXxx)
.setYyy(myYyy)
.setZzz(myZzz)
// ... etc.
.build();
Siehe Seite 8 und folgende dieser Präsentation von Josh Bloch (PDF) oder dieser Besprechung von Effective Java