gpt4 book ai didi

java - 何时使用 Joshua Bloch 的 Builder 实现,何时使用常规版本?

转载 作者:行者123 更新时间:2023-12-01 23:35:58 27 4
gpt4 key购买 nike

我想知道什么时候应该使用内部带有静态类的构建器以及经典的构建器?

《Effective Java》一书的实现

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;
}
}

定期实现

(只是图表) enter image description here

最佳答案

1.您需要防止对象进入不一致的状态AND 2.时,您应该考虑使用构建器模式构造函数参数将难以使用/读取,因为您需要设置大量笨重(大量)的属性。

使用普通的默认构造函数 + getters/setters 可能会让消费者进入无效/不一致的状态。 IE。他们可能会忘记设置一个非常重要的属性(例如奶酪),但他们不会被阻止这样做,并且无论如何都可以创建披萨,即使在“坏”状态下也是如此。消费者有责任在构造后适本地设置对象的状态。

您通常可以通过构造函数参数来防止这种情况。例如

private Pizza() {}
public Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon)
{
...
}

但是当您有大量参数时,这可能很难读/写。

所以,总而言之,当你想保证你的对象不能在不一致的状态下构造,并且你有太多字段需要设置,使用构造函数参数会导致难以使用和读取时,你可以考虑使用构建器模式。

关于java - 何时使用 Joshua Bloch 的 Builder 实现,何时使用常规版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18707535/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com