Skip to Content »

Life of Recht » Constructor Builder Pattern

 Constructor Builder Pattern

  • May 19th, 2006
  • 12:46 am
Joshua Bloch præsenterede et interessant pattern i hans Effective Java Reloaded session. Dem der har læst Effective Java ved, at han er stor fortaler for objekter, der ikke kan ændres efter de er blevet instantieret. Det synspunkt har jeg arvet, og det fungerer fint – bortset fra et lille problem, nemlig at hvis et objekt har mange attributter, så bliver klassens constructor temmelig stor. Det bliver kun værre når nogle attributter ikke er påkrævede. Enten skal man fylde defaultværdier i, eller også skal man lave en hel stak constructors – hvor mange ved man aldrig helt, for det kommer jo an på brugen. Det er der imidlertid en løsning på, der er baseret på Builder Pattern, hvor man først bruger en builder til at konfigurere med, og derefter får et færdigt objekt. I constructor-tilfældet ser det nogenlunde således ud:
public class Test {
private final String name;
private final String field;

private Test(TestBuilder builder) {
name = builder.name;
field = builder.field;
}

public static class TestBuilder {
private String name;
private String field;

public TestBuilder name(String name) {
this.name = name;
return this;
}

public TestBuilder field(String field) {
this.field = field;
return this;
}

public Test build() {
return new Test(this);
}
}

public static void main(String[] args) {
Test t = new Test.TestBuilder().
name("name").field("f").build();
}
}

Det har oven i købet den fornemme sideeffekt, at man får noget, der ligner navngivne parametre – dvs. ikke noget med at huske på, hvilken rækkefølge parametrene kommer i længere. Har en klasse nogle attributter, der er påkrævede, skal de bare tilføjes i constructoren til builderen.

Nu er der så bare lige nogen, der skal lave et lille source-plugin til eclipse, der lige som “Generate Setters and Getters” kan autogenerere sådan en builder – det burde ikke være noget videre problem.

Want your say?

* Required fields. Your e-mail address will not be published on this site

You can use the following XHTML tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>