我试图在下面的类中使用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
always和其他字段是可选的。
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");
ModelInput input = new ModelInput(109739281L, 20L, Preference.SECONDARY, paramMap, 1000L, true);
我如何将上述代码转换为开始使用Builder模式,就像Bloch在Effective Java中所说的那样,它也是线程安全且不可变的?
以及如何使用Builder模式对此进行验证检查?人们可能会传递与客户端ID和超时相同的map以及与用户ID相同的零或负数。
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();
希望这可以帮助 :)
问题内容: 我想在使用vcs或dvcs时学习其他人的工作流程。 请描述您处理以下任务的策略: 实施功能 修复错误(在开发和部署应用期间) 代码审查 重构代码(审查后的代码) 合并补丁 发布较新版本的应用程序(台式机,网络,移动设备,您是否会区别对待?) 随意组织您的答案,而不是按任务分组,而是按您认为相关的任何分组,但请按VCS / DVCS进行组织(请不要混合使用)。 谢谢。 问题答案: VCS
计算机科学是一个极其宽泛的学科。全球的分布式系统、人工智能、机器人、图形、安全、科学计算,计算机体系结构和许多新兴的二级领域,每年都会由于新技术和新发现而扩展。计算机科学的快速发展广泛影响了人类生活。商业、通信、科学、艺术、休闲和政治都被计算机领域彻底改造。
我试图用Swagger来描述我正在构建的web-api。问题是我无法理解如何描述复杂的json对象? 比如如何描述这个对象:
本文对用于描述模块的术语加以说明。 说明 对模块用途的简要说明。 状态(Status) 状态(Status)代表了此模块与Apache服务器结合的紧密程度;也就是说,有可能需要重新编译服务器以获得一个模块的功能。其可能的值有: MPM 一个多路处理模块。与其他类型的模块不同的是,必须在编译配置时进行选择,必须有且仅有一个MPM被静态编译到服务器中。此类型的模块负责基本的对请求的处理和指派。 Bas
问题内容: 我目前正在使用Builder模式,紧跟在Wikipedia文章 Builder模式 http://en.wikipedia.org/wiki/Builder_pattern中建议的Java实现 这是一个示例代码,说明了我的实现 在我的一些使用此类的应用程序中,我碰巧发现了非常相似的建筑代码,因此我想将其子类化,并将所有重复的代码移入其构造函数中。这就是问题所在。 如何调用超类生成器并将