0
public class MyPojo{
    String required;
    Integer optionalOne;
    Integer optionalTwo;

    private MyPojo(Builder builder){
        this.required = builder.required
        this.optionalOne = builder.one;
        this.optionalTwo = builder.two;
    }

    public static class Builder{

        String required;
        Integer optionalOne =0;
        Integer optionalTwo =0;

        public Builder(String req){
            this.required = req;
            return this;
        }
        public Builder optionalOne(Integer one){
            this.one = one;
            return this;
        }
        public Builder optionalTwo(Integer two){
            this.two = two;
            return this;
        }
        public MyPojo build(){
            return new MyPojo(this);
        }
    }
}

然后这样调用:

MyPojo myPojo = new MyPojo.Builder("req").optionalOne(1).optionalTwo(2).build();

这一切都很可爱,但我不明白几个部分。

有两个New语句,一个在调用语句中,一个在build()方法中,但是只创建了一个新对象?

另外,如果我再调用第二次,没有第二个可选参数:

MyPojo myPojo = new MyPojo.Builder("req").optionalOne(1).build();

为什么 optionalTwo 会恢复为默认值(零)。并且不保留第一次传递的值(2),它是一个静态类,所以一个实例在所有 MyPojos 之间共享?

4

2 回答 2

3

这一点:

 new MyPojo().Builder("req")

应该:

 new MyPojo.Builder("req")

因此,您首先创建一个Builder,然后该Build方法(build顺便说一句会更好)创建不可变对象。

如果您创建第二个实例,那将与第一个实例完全分开。不要Builder被声明为静态的类所迷惑——这只是意味着 的实例Builder没有MyPojo与之关联的隐式“父”类引用。单独实例的字段Builder仍然是完全分开的。

于 2011-09-16T08:47:14.237 回答
-1

这里有几个错误。正如所写的那样,它甚至没有编译。

查找Fluent Interface以了解它应该如何工作。现在考虑

MyPojo myPojo = new MyPojo.Builder(req).optionalOne(1).optionalTwo(2).Build();

(这不是你拥有的,这是你应该拥有的)

这是它的工作原理:

  1. new MyPojo.Builder(req)创建一个 MyPojo.Builder 对象并将传递的 req 分配给this.required
  2. .optionOne(1)将 1 分配给MyPojo.Builder.optionalOne. 然后它返回相同的 Object ( return this)。这是关键,因为它允许下一步
  3. .optionOne(2)将 2 分配给上一次调用返回MyPojo.Builder.optionalTwo的对象。MyPojo.Builder请注意,我们仍在使用Builder在步骤 1this中创建的相同对象。再次返回
  4. Build()调用Build上的方法Builder,然后调用MyPojo构造函数。应该调用此方法build以符合 Java 命名约定。

编辑:代码不可编译。EDIT2:详细说明

于 2011-09-16T08:47:08.480 回答