java - 如何创建包含集合的不可变类的不可变构建器?

标签 java design-patterns builder

我正在尝试创建一个包含 Set 的不可变类的不可变构建器。它实际上应该是一个不可变的集合,但现在我必须使用常规的 JCF 类。使用标准比萨饼示例,我将比萨饼底料作为强制参数,将配料作为可选参数,允许 0 或更多。我想每次调用 addToppings() 都会创建一个新的不可变构建器,其中包含一组浇头,然后最后在调用构建时将交付 Pizza 对象。我只是不知道如何构建不可变的 toppings 集。这是我的代码:

public class Pizza {

private Pizza(Base base, Set<Topping> toppings) {
    this.base = base;
    this.toppings = toppings;
}

public static PizzaBuilder createBuilder(Base pizzaBase) {
    return new PizzaBuilder(new Pizza(pizzaBase, null));
}

public static class PizzaBuilder {
    private PizzaBuilder(Pizza pizza) {
        this.pizza = pizza;
    }

    public PizzaBuilder addTopping(Topping topping) {
        return new PizzaBuilder(new Pizza(pizza.base, ???));
    }

    public Pizza build() {
        return pizza;
    }

    final private Pizza pizza;
}

public Collection<Topping> getToppings() {
    return Collections.unmodifiableSet(toppings);
}

enum Base {DEEP_PAN, THIN}
enum Topping {MOZZARELLA, TOMATO, ANCHOVIES, PEPPERONI}

final private Base base;
final private Set<Topping> toppings;

我知道这偏离了“标准”新构建器模式,但我发现在那里存储和复制值并不优雅,因为目标类已经定义了需要哪些字段。

最佳答案

public PizzaBuilder addTopping(Topping topping) {
    Set<Topping> toppings = null;
    if (pizza.toppings == null)
        toppings = new LinkedHashSet<Topping>();
    else
        toppings = new LinkedHashSet<Topping>(pizza.toppings);
    toppings.add(topping);
    return new PizzaBuilder(new Pizza(pizza.base, toppings));
}

这就是你感兴趣的吗?我选择了 LinkedHashSet 来维护浇头的顺序。

关于java - 如何创建包含集合的不可变类的不可变构建器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396534/

相关文章:

java - Spring Boot中预处理第三方库方法

java - 使用 @Builder(toBuilder = true) 而不是 setter 会产生开销吗?

java - 在特定位置设置相机动画

java - 我的总数没有在循环中更新

java - 从 Collection/Map 获取参数化数组

c++ - 空对象模式和函数

python - 将参数传递给具有组件子构建器的构建器

javascript - 使用 Spring Security 保护 Web 应用程序免受 CSRF 攻击

java - 如何让其他人使用依赖数据库的桌面应用程序?

ios - iOS中能否实现单例继承