gpt4 book ai didi

java - 如何在我的 ModelInput 类中使用 Joshua Bloch 版本所描述的构建器模式?

转载 作者:行者123 更新时间:2023-11-29 07:51:12 24 4
gpt4 key购买 nike

我正在尝试为下面的类使用 Builder 模式。最初我使用类的构造函数来设置所有参数,但不小心遇到了 Builder 模式,它看起来很适合我的用例。

下面是我的类(class),其中人们通常总是传递 userIdclientIdparameterMap,但其他字段是可选的,它们可能会也可能会不通过它。而且,如果他们没有传递任何超时值,我需要将默认超时值始终设置为 500,但如果他们传递任何超时值,那么它应该覆盖我的默认超时值。这里的 Preference 是一个有四个字段的 ENUM。

public final class ModelInput {

private long userid;
private long clientid;
private long timeout = 500L;
private Preference pref;
private boolean debug;
private Map<String, String> parameterMap;

public ModelInput(long userid, long clientid, Preference pref, Map<String, String> parameterMap, long timeout, boolean debug) {
this.userid = userid;
this.clientid = clientid;
this.pref = pref;
this.parameterMap = parameterMap;
this.timeout = timeout;
this.debug = debug;
}

... //getters here
}

下面是一个例子,我最初是如何通过将参数传递给构造函数来构造 ModelInput 对象的。最初我传递了所有参数,但客户端将主要传递 userIdclientIdparameterMap 并且其他字段是可选的..

Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

ModelInput input = new ModelInput(109739281L, 20L, Preference.SECONDARY, paramMap, 1000L, true);

如何转换我的上述代码以开始使用 Bloch 在 Effective Java 中所说的 Builder 模式,它也是线程安全且不可变的?

我如何使用构建器模式对此进行验证检查?人们可能可以传递 userId 零或负数,与客户端 id 和超时相同,也与 map 相同..

最佳答案

Builder 构造函数必须具有强制参数。因此,在您的情况下,如果 userId、clientId 和 parameterMap 是强制性的,我们将有类似的东西:

public final class ModelInput {

private long userid;
private long clientid;
private long timeout = 500L;
private Preference pref;
private boolean debug;
private Map<String, String> parameterMap;

public ModelInput(Builder builder) {
this.userid = builder.userId;
this.clientid = builder.clientId;
this.pref = builder.preference;
this.parameterMap = builder.parameterMap;
this.timeout = builder.timeout;
this.debug = builder.debug;
}

public static class Builder {
private long userId;
private long clientId;
private Preference preference;
private boolean debug;
private Map<String, String> parameterMap;

public Builder(long userId, long clientId, Map<String, String> parameterMap) {
this.userId = userId;
this.clientId = clientId;
this.parameterMap = parameterMap;
}

public Builder preference(Preference preference) {
this.preference = preference;
return this;
}

public Builder debug(boolean debug) {
this.debug = debug;
return this;
}

public Builder timeout(long timeout) {
this.timeout = timeout;
return this;
}

...

public ModelInput build() {
return ModelInput(this);
}
}

// ModelInput getters / setters
}

这是如何使用构建器类:

String paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

ModelInput.Builder builder = new ModelInput.Builder(109739281L, 20L, paramMap);
builder.preference(Preference.SECONDARY).timeout(1000L).debug(true);

ModelInput modelInput = builder.build();

希望这有帮助:)

关于java - 如何在我的 ModelInput 类中使用 Joshua Bloch 版本所描述的构建器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21040771/

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