Effective Java
Item 02

Item 02: Consider a builder when faced with many constructor parameters

Builder pattern

  • Good for designing classes whose constructors or static factories would have more than a handful of parameters.
  • Better to start with a builder in the first place to avoid obsolete constructors or static factories.
public class NutritionFacts {
  public static class Builder {
    // required parameters
    // ...
    
    // optional parameters - initialized to default values
    // ...
 
    // builder methods
    public NutritionFacts build() {
      return new NutritionFacts(this);
    }
  }
  
  // builder constructor
  private NutritionFacts(Builder builder) {
    // set up parameters
  }
}

Builder for class hierarchies

Simulated self-type idiom: the self() method provides a workaround for the fact that Java lacks a self type.

public abstract class Pizza {
  abstract static class Builder<T extends Builder<T>> {
    abstract Pizza build();
 
    // self-type idiom
    protected abstract T self();
  }
  
  Pizza(Builder<?> builder) {
    // set up parameters
  }
}