当前位置: 首页 > 知识库问答 >
问题:

如何像我的ModelInput类中的Joshua Bloch版本所描述的那样使用构建器模式?

端木涵润
2023-03-14
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
}    
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

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

共有1个答案

太叔小云
2023-03-14

构造函数必须具有强制参数。因此,在您的例子中,如果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();

希望这有帮助:)

 类似资料:
  • 问题内容: 我试图在下面的类中使用Builder模式。最初,我使用类的构造函数来设置所有参数,但是偶然地我碰到了Builder模式,它对我的​​用例非常有用。 下面是我的课程,人们通常会通过,而总是,但其他字段是可选的,他们可能会或可能不会通过。而且,如果他们没有传递任何超时值,我需要将默认超时值始终设置为500,但是如果他们传递任何超时值,则它应该覆盖我的默认超时值。这里,Preference是

  • Android新构建系统需要Gradle 1.10+版本。如何在内部配置?

  • 我有以下字符串: 我需要一个正则表达式来删除数字之间的空白,但也要避免在数字之前有一个非数字值,如 这里想要避免任何非数值后面的数值,这里在我的字符串中想要避免数值也在H后面,这里有2,但我只想做一个像“23445 2546”这样的字符串。如果有任何字母字符在那里,它应该被删除,并添加空格之间的数字。 从上面的正则表达式和代码,我得到了输出: 所需输出:

  • 问题内容: 我想 远程 更改Jenkins构建说明。我准备好了所有脚本,但有一个小问题:多行描述。 我在Jenkins中使用REST API和JSON下载旧描述: `curl命令退出: ( 注意 :我添加了换行符以使上面的内容更易于阅读。这被单行提取)。 这些是单独的行,所以我这样做: 变为: ( 注意 :新行是值的一部分。这是三行描述。) 我的程序(取决于命令行参数)可以替换,附加或在构建之前添

  • 我正在运行一个内存密集型应用程序。一些关于环境的信息: 64位debian 13 GB RAM 64位JVM(我的程序运行时输出System.getProperty("sun.arch.data.model"),它说"64") 下面是我发出的确切命令: Java-xmx 9000m-jar " ale . jar " test config 我已经用同样精确的数据、配置等运行了程序。在其他几个系统

  • NotConnectedException:45000 ms后无法连接到端口7055上的主机127.0.0.1。Firefox控制台输出: