вложенный класс статического компоновщика, дальнейшие пояснения по его подключению - PullRequest
0 голосов
/ 16 сентября 2011
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();

Что прекрасно, но я не понимаю пару частей.

Есть две Новые операторы , один в вызывающем операторе и один в методе build(), но создан только один новый объект?

Кроме того, если я затем вызову второй раз, без второго необязательного параметра:1012 *

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

Почему необязательно два возвращаются к значению по умолчанию (нулю).И не сохранять значение, переданное в первый раз (2), это статический класс, поэтому один экземпляр используется всеми MyPojos?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Этот бит:

 new MyPojo().Builder("req")

должно быть:

 new MyPojo.Builder("req")

Итак, вы сначала создаете Builder, а затем метод Build (что было бы лучше, если бы build btw) создавал неизменный объект.

Если вы создадите второй экземпляр, он будет полностью отделен от первого. Не дайте себя обмануть тем, что класс Builder объявлен как статический - это просто означает, что экземпляр Builder не имеет неявной ссылки на родительский класс MyPojo, связанной с ним. Поля отдельных Builder экземпляров по-прежнему полностью разделены.

0 голосов
/ 16 сентября 2011

Здесь есть несколько ошибок.Как написано, он даже не компилируется.

Посмотрите Свободный интерфейс , как он должен работать.Теперь рассмотрим

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

(это не то, что у вас есть, это то, что вы должны иметь)

Вот как это работает:

  1. new MyPojo.Builder(req) создает объект MyPojo.Builder и присваивает переданное требование this.required
  2. .optionOne(1), присваивает 1 MyPojo.Builder.optionalOne.Затем он возвращает тот же объект (return this).Это ключ, потому что он позволяет следующему шагу
  3. .optionOne(2) назначать от 2 до MyPojo.Builder.optionalTwo объекту MyPojo.Builder, возвращенному предыдущим вызовом.Обратите внимание, что мы все еще работаем с тем же объектом Builder, созданным на шаге 1. this возвращается снова
  4. Build() вызывает Build метод для Builder, который в свою очередь вызывает MyPojo конструктор.Этот метод должен называться build, чтобы соответствовать соглашениям об именах Java.

РЕДАКТИРОВАТЬ: код не компилируется.EDIT2: подробное объяснение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...