gpt4 book ai didi

java - 使用构建器构建 "partially"可变对象?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:13:05 24 4
gpt4 key购买 nike

在创建“部分”可变的对象(即对象的某些属性是可变的)时,我无法确定使用构建器是否是正确的方法。

让我们考虑一下 IGlass 接口(interface)的实现。一个最后的强制参数,一个可选参数,可以在对象创建后更改:

public class SimpleGlass implements IGlass {

// Mandatory.
private final int size;

// Optional.
private boolean isEmpty;

private SimpleGlass(SimpleGlassBuilder builder) {
size = builder.getSize();
isEmpty = builder.isEmpty();
}

@Override
public int getSize() {
return size;
}

@Override
public boolean isEmpty() {
return isEmpty;
}

@Override
public void setEmpty(boolean isEmpty) {
this.isEmpty = isEmpty;
}

public static class SimpleGlassBuilder {

// Mandatory.
private final int size;

// Optional.
private boolean isEmpty = false;

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

public SimpleGlassBuilder setEmpty(boolean isEmpty) {
this.isEmpty = isEmpty;
return this;
}

public IGlass build() {
return new SimpleGlass(this);
}

public int getSize() {
return size;
}

public boolean isEmpty() {
return isEmpty;
}
}
}

所以构建器创建可变对象,然而,每当编程文献中提到构建器时,它都是关于不可变对象(immutable对象)的。

在这种情况下可以使用构建器吗?

最佳答案

我会说 Builder 用于具有很多属性的类,其中大部分属性是可选的。您无需使用一百万个构造函数或一个糟糕的构造函数,而是使用一个构建器并指定您需要的内容。

new GlassBuilder(16_OZ).withHandle().withLogo(logo).build()

// instead of
new Glass(16_OZ,
/* handle? */ true,
/* chipped? */ false,
/* monogram? */ null,
/* something else? */ null,
logo);

最终可变性很好,因为可变性很好,但它实际上并不影响 Builder 是否让您的生活更轻松。

关于java - 使用构建器构建 "partially"可变对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061126/

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