gpt4 book ai didi

java - 是否有类似 "build-once"构建器的东西?

转载 作者:行者123 更新时间:2023-11-30 06:57:47 25 4
gpt4 key购买 nike

我们的框架提供了某种“日志”对象;它实际上代表了我们遗留 C/C++ 代码中的遗留结构。今天我开始编写一个帮助程序类,它使用构建器模式来允许使用更现代的方法来创建此类日志对象。

但是有一题我不确定正确答案是什么:

基本上这些日志对象有一些“必需”的属性;因此,按照构建器模式,您必须将这些参数指定为我的新构建器类的 ctor 的参数。然后构建器有一些方法来配置“可选属性”;当然还有一个方法“build()”,它会发出一个日志对象,其中包含收集到的值的摘要。

但现在我想知道:我是否应该关心人们是否会重复使用同一个构建器对象?那么,我是否应该有一个“reset()”方法来清除所有可选参数?或防止 build() 被多次调用?或者最好不要担心,而不是全部?

最佳答案

should I care if people would be re-using the same builder object?

好吧,你想观察副作用,但我认为这就是你问的原因,因为你知道人/代码会在构建器中留下垃圾。

So, should I have a "reset()" method to clear all optional arguments;

我认为,如果传递构建器,清理的责任应该落在消费者身上(将构建器作为输入的函数或类)。这样我们就不会造成副作用。示例:

public class SomeClass {
public SomeClass(Log.Builder builder){
builder.tag("SomeClass"); //bad, we caused a side effect
//someone class forgets to set the tag
//later, then they get this tag
log = builder.build();
}
}

一个解决方案是提供一个复制构造函数:

public class SomeClass {
public SomeClass(Log.Builder builder){
Log.Builder localBuilder = new Log.Builder(builder); //copy constructor being used.
localBuilder.tag("SomeClass"); //only applies to the local builder
log = localBuilder.build();
} //builder is as it was before the call, no side effect
}

你甚至可以用一个副本调用SomeClass,这样你就不需要关心它是否被实现为没有副作用:

Log.Builder defaults = new Log.Builder(...whatever...).tag("notag");
new SomeClass(new Log.Builder(defaults));
new SomeClass2(new Log.Builder(defaults));

要进一步锁定它,您可以有一个接口(interface) Log.ReadOnlyBuilder,它没有 setter,实际上只适用于构建或创建副本:

public class Log {
public interface ReadOnlyBuilder {
Builder copy();
Log build();
}

public static class Builder implements ReadOnlyBuilder {
Builder tag(String tag){
...
}
}
}

public class SomeClass {
public SomeClass(Log.ReadOnlyBuilder builder){
log = builder.copy().tag("SomeClass").build();
} //builder is as it was before the call, no side effect
}

我喜欢这样,因为责任又回到了消费者身上,不造成副作用,但它是通过类型和接口(interface)强制执行的。另外,如果他们不需要设置任何字段,他们可以只使用只读构建器,我们不必复制以防万一。

附言我不认为 optional 和 required 是你想要决定重置什么和设置什么的划分点。我认为复制构造函数应该只将构建器中的每个字段复制到新的构建器中。但是您可以随意开发 copy 方法/构造函数。

关于java - 是否有类似 "build-once"构建器的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289606/

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