결론

telescoping constructor pattern 이나, JavaBenas pattern 을 쓸 바에는 Builder pattern 을 써라

빌더 패턴(Builder pattern)

public abstract class Pizza {
  public enum Topping { HAM, MUSHROOM, ONION, PEPPER, SAUSAGE }
  final Set<Topping> toppings;

  protected abstract static class Builder<T extends Builder<T>> {
    EnumSet<Topping> toppings = EnumSet.noneOf(Topping.class);

    protected T addTopping(Topping topping) {
      toppings.add(Objects.requireNonNull(topping));
      return self();
    }

    protected abstract T self();
    protected abstract Pizza build();
  }
}

public class NyPizza extends Pizza {
  public enumSize { SMALL, MEDIUM, LARGE }
  private final Size size;

  public static class Builder extends Pizza.Builder<Builder> {
    private final Size size;

    public Builder(Size size) {
      this.size = Objects.requireNonNull(size);
    }

    @Override
    protected Builder self() {
      return this;
    }

    @Override
    protected NyPizza build() {
      return new NyPizza(this);
    }
  }

  private NyPizza(Builder builder) {
    super(builder);
    size = builder.size;
  }
}

new NyPizza.Builder(SMALL)
  .addTopping(SAUSAGE)
  .addTopping(ONION)
  .build();

점층적 생성자 패턴(telescoping constructor pattern)

class MyObject {
  int a;
  int b;
  int c;

  MyObject(int a, int b, int c) {
    this.a = a;
    this.b = b;
    this.c = c;
  }

  MyObject(int a, int b) {
    this(a, b, 0);
  }

  MyObject(int a) {
    this(a, 0, 0);
  }
}

자바빈즈 패턴(JavaBeans pattern)

class MyObject {
  int a;
  int b;
  int c;

  void setA(int a) {
    this.a = a;
  }

  void setB(int b) {
    this.b = b;
  }

  void setC(int c) {
    this.c = c;
  }
}