我很难弄清楚如何更改由构建器模式创建的对象中的某些字段: 例如,这是课程
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 pizza = new Pizza.Builder(12)
.cheese(true)
.pepperoni(true)
.bacon(true)
.build();
现在我要查找的是如何更改此对象 例如奶酪田地假? 我没有getter和setter方法,我知道我可以使用反射,但是这会使代码更难以阅读和理解。 那么,构建器模式对不是最终对象有用吗?
答案 0 :(得分:3)
构建器模式通常可以用来创建不可变的对象,但是它不需要这样做。如果您希望能够在class C
之后更改值,则只需为此添加一个设置器。
答案 1 :(得分:1)
如何在此对象(例如,奶酪字段)中将其更改为false?
您应将setter
添加到Pizza
中,如下所示:
class Pizza {
//...
public void setCheese(boolean cheese) {
this.cheese = cheese;
}
@Override
public String toString() {
return String.format("cheese: %s", this.cheese);
}
//...
}
然后您可以将其用作:
System.out.println(pizza);
pizza.setCheese(false);
System.out.println(pizza);
初始化后,输出:
cheese: true
cheese: false
构建器模式对不是最终对象有用吗?
有一些有趣的帖子在讨论Builder Pattern
:Three Reasons Why I Like the Builder Pattern和When would you use the Builder Pattern?。
我个人说,这完全取决于您的情况本身。
答案 2 :(得分:0)
Builder类应该具有设置可选参数的方法,并且在设置了可选属性之后,它应该返回相同的Builder对象。 由于“奶酪”是您的可选参数,因此您需要在Builder类中为其设置一个值
public Builder cheese(Boolean cheese) {
this.cheese = cheese;
return this;
}
然后您可以使用:
Pizza pizza1 = new Pizza.Builder(12)
.cheese(false)
.pepperoni(true)
.bacon(true)
.build();