我正在尝试为下面的类使用 Builder 模式。最初我使用类的构造函数来设置所有参数,但不小心遇到了 Builder 模式,它看起来很适合我的用例。
下面是我的课程,大多数人都会通过userId
,clientId
并且parameterMap
总是但其他字段是可选的,他们可能会通过也可能不会通过。而且,如果他们没有传递任何超时值,我需要始终将默认超时值设置为 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
通过将参数传递给构造函数来构造对象的。最初我传递了所有参数,但客户端大多会传递userId
,clientId
并且parameterMap
总是和其他字段是可选的..
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 模式,它也是线程安全且不可变的?
以及如何使用 Builder 模式对此进行验证检查?人们可能会传递与客户端 ID 和超时相同的 userId 零或负数,也可能与 map 相同..