Какова цель этого шаблона кода? - PullRequest
0 голосов
/ 30 мая 2018

Я отлаживаю чей-то код, и я просто не понимаю преимущества такого способа кодирования в Java.

Я не эксперт по Java Design Pattern, но я хотел бы знать, когда это применимо?

public class MyClass {

    public static class Builder {
        //Getters and setters
    }

    public static Builder newBuilder() {
        return new Builder();
    }

    public MyClass(Builder builder) {
        //More Methods
    }

    public static void main(String[] args) {
        MyClass.Builder builder = MyClass.newBuilder();
        new MyClass(builder);
    }
}

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Это реализация с несколькими неправильными настройками шаблона построителя :

Цель шаблона проектирования Builder - отделить конструкцию сложного объекта от его представления.Таким образом, один и тот же процесс конструирования может создавать разные представления.

Странно то, что конструктор класса Builder вызывается из MyClass.Обычно этого не делается, поскольку связывает класс MyClass с Builder, а не наоборот.

Кроме того, конструктор MyClass должен иметь значение private, чтобы никто не мог получить к нему прямой доступ, а только с помощьюBuilder.

Правильная реализация должна быть следующей:

public class MyClass {
    // Often fields are final to create an immutable class
    private final String fieldA;

    // Private constructor using Builder to set inner fields
    // To create MyClass you have to use Builder
    private MyClass(Builder builder) {
        // Setting fields from builder
        this.a = builder.getFieldA();
    }

    public static class Builder {
       // Fields on Builder are not final
       private String fieldA;

       //Getters and setters

       // Method to set field of builder
       public Builder setFieldA(String a) {
          this.a = a;
          return this;   // Returning this to chain setters
       }

    ...
        // Method to instantiate MyClass
        public MyClass build() {
           return new MyClass(this);
        }
    }
}

// Calling it as follow
MyClass a = new MyClass.Builder()
                .setFieldA("value")
                .setFieldB("value")
                .build();
0 голосов
/ 30 мая 2018

В соответствии с именованием это выглядит как один из шаблонов создания - шаблон Builder.Тем не менее, это не очень хорошо реализовано.

Цель этого шаблона - написать читаемый и чистый код для создания очень сложного объекта.Хороший и в то же время простой пример: StringBuilder.Он часто реализуется с помощью свободного интерфейса - типичным примером является Stream<T>.

Правильная реализация, например, здесь .Позволяет создать объект, используя методы, возвращающие конструктор.Пример:

MyClass foo = MyClass.newBuilder()
    .cached()
    .with(new Feature1())
    .with(new Feature2())
    .foo()
    .bar()
    .build();

Моя личная точка зрения на этот шаблон:

Он поощряет создание и использование сложных объектов.Я предпочитаю рефакторинг объекта, который имеет конструктор с меньшими компонентами.Объект становится легко тестируемым и создаваемым только с помощью конструкторов.

0 голосов
/ 30 мая 2018

Шаблон Builder предоставляет то, что называется Fluent API.Вместо отдельных вызовов set в каждой строке вы можете связать сеттеры с последующим методом окончательной сборки, чтобы получить экземпляр класса.Обычно нет объектов-получателей для объекта построителя.

Этот конструктор является формой конструктора копирования.Я предполагаю, что есть другой код, использующий его для создания уникальных экземпляров объекта с теми же данными.

Последняя строка вашего метода main ничего не делает, так как вы не назначаете этот новый класс.В любом случае, как уже упоминалось, вы обычно используете метод сборки, а не передаете конструктор в конструктор

MyClass foo = MyClass.newBuilder()
    .withBar("blah")
    .build();

MyClass.newBuilder() также можно заменить на new MyClass.Builder()

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