telescoping constructor pattern 이나, JavaBenas 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();
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);
}
}
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;
}
}