版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
package Effective02.P12;
import java.util.EnumSet;
import java.util.Objects;
import java.util.Set;
public abstract class Pizza {
public enum Topping{
HAM, MUSHROOM, ONION,PEPPER, SAUSAGE
}
final Set<Topping> toppings;
Pizza (Builder<?> builder){
toppings =builder.toppings.clone();
}
abstract static class Builder<T extends Builder<T>>{
EnumSet<Topping> toppings =EnumSet.noneOf(Topping.class); //用于创建elementType类型的空集
public T addTopping(Topping topping){
//Objects.requireNonNull()如果当前对象为空 会抛出一个空指针异常
//否则就会返回当前对象
toppings.add(Objects.requireNonNull(topping));
return self();
}
abstract NyPizza build();
protected abstract T self();
}
@Override
public String toString() {
return super.toString();
}
}
package Effective02.P12;
import java.util.Objects;
public class NyPizza extends Pizza{
public enum Size {SMALL, MEDIUM, LARGE }
private final Size size;
private NyPizza (Builder builder){
super(builder);
size =builder.size;
}
public static class Builder extends Pizza.Builder<Builder>{
private final Size size;
public Builder(Size size){
this.size = Objects.requireNonNull(size);
}
public NyPizza build(){
return new NyPizza(this);
}
protected Builder self(){
return this;
}
}
@Override
public String toString() {
System.out.println("size: "+ size);
return super.toString();
}
}
package Effective02.P12;
public class MainClass {
public static void main(String[] args) {
NyPizza pizza = new NyPizza.Builder( NyPizza.Size.SMALL )
.addTopping( Pizza.Topping.SAUSAGE ).addTopping( Pizza.Topping.ONION ).build();
System.out.println(pizza.toString());
}
}