java builder模式和更改字段

java builder模式和更改字段,java,design-patterns,builder,Java,Design Patterns,Builder,我很难弄清楚如何更改builder模式创建的对象中的某些字段: 例如,这是一个类 public class Pizza { private int size; private boolean cheese; private boolean pepperoni; private boolean bacon; public static class Builder { //required private final int size; //optio

我很难弄清楚如何更改builder模式创建的对象中的某些字段: 例如,这是一个类

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

    public Pizza build() {
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}
Pizza obect是这样创建的:

Pizza pizza = new Pizza.Builder(12)
                       .cheese(true)
                       .pepperoni(true)
                       .bacon(true)
                       .build();
现在我想知道的是如何改变这个物体 例如,奶酪字段是否为假? 我没有getter和setter,我知道我可以使用反射,但它使代码更难阅读和理解。
那么构建器模式对非最终对象有用吗?

构建器模式通常很适合创建不可变对象,但不需要这样做。如果您希望能够在构建之后更改值,那么只需要为此添加一个setter

如何将此对象(例如cheese字段)更改为false

您应该在比萨饼中添加一个setter,如下所示:

然后您可以将其用作:

    System.out.println(pizza);
    pizza.setCheese(false);
    System.out.println(pizza);
初始化后,输出:

cheese: true
cheese: false
那么,构建器模式对非最终对象有用吗

有一些有趣的帖子讨论了构建器模式:和


就我个人而言,这完全取决于你的案子本身

Builder类应该具有设置可选参数的方法,并且在设置可选属性后应该返回相同的Builder对象。 因为cheese是您的可选参数,所以您需要在生成器类中为其设置一个setter

public Builder cheese(Boolean cheese) {
            this.cheese = cheese;
            return this;
        }
然后您可以使用:

Pizza pizza1 = new Pizza.Builder(12)
                       .cheese(false)
                       .pepperoni(true)
                       .bacon(true)
                       .build();

添加getter/setter。所以,生成器模式对非最终对象有用吗?生成器是构建对象,而不是对其进行变异。只需添加getter和setter方法。据我所知,在使用Builder模式时,不允许在POJO中提供它们,因为该模式仅用于构建/创建对象。嗯,因此当我将Builder模式用于具有例如8个变量的类时,我将有这些字段的getter/setter,除此之外还有一个构建器,他将为我构建一个对象。。。看来会有很多代码。。。例如,不使用Lombock或任何其他库。在这种情况下,对我来说最好的例子是只有getter和setter代码,并且易于阅读,我可以修改它们。@Kacu我同意,对于不可变对象,我会使用builder,对于字段,我只使用getter。这就是Java,它以大量样板代码而闻名。
Pizza pizza1 = new Pizza.Builder(12)
                       .cheese(false)
                       .pepperoni(true)
                       .bacon(true)
                       .build();