Java >> Java Tutorial >  >> Java

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

schreiben
Student 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


Java-Tag