Шаблон Builder не возвращает «это» - PullRequest
0 голосов
/ 24 апреля 2018

Сегодня я использовал RestTemplateBuilder при весенней загрузке и обнаружил, что его методы не возвращают «this», вместо этого они возвращают новый экземпляр компоновщика.

public RestTemplateBuilder basicAuthorization(String username, String password) {
    return new RestTemplateBuilder(this.detectRequestFactory, this.rootUri,
            this.messageConverters, this.requestFactory, this.uriTemplateHandler,
            this.errorHandler, new BasicAuthorizationInterceptor(username, password),
            this.restTemplateCustomizers, this.requestFactoryCustomizers,
            this.interceptors);
}

Это первый раз, когда я вижу, что шаблон строителя не возвращает "this" в конце. Есть ли для этого веская причина?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Шаблон компоновщика не обязан возвращать this для каждого метода.Это деталь реализации, и она инкапсулирована в самом классе.

Как я понимаю, это сделано для неизменности, поэтому вы можете использовать один и тот же экземпляр RestTemplateBuilder для создания разных экземпляров RestTemplate.Давайте рассмотрим этот пример:

RestTemplateBuilder basicRestTemplateBuilder = new RestTmplateBuilder();
RestTemplate restTemplateWithBasicAuth = basicRestTemplateBuilder.basicAuthorization(username, password).build();
RestTemplate restTemlateWithUriTemplateHadler = basicRestTemplateBuilder.uriTemplateHandler(uriTemplateHandler).build();

Вы можете безопасно повторно использовать тот же экземпляр компоновщика и не беспокоиться о том, что он будет настроен неправильно где-то еще.

0 голосов
/ 24 апреля 2018

Этот класс не использует шаблон Builder. Это конструктор для создания RestTemplate экземпляров. Тогда как название: RestTemplateBuilder.
Метод для создания экземпляра RestTemplate:

public RestTemplate build() {
    return build(RestTemplate.class);
}

Мы можем видеть, что экземпляр класса RestTemplateBuilder создается и возвращается этим открытым конструктором (т.е. не шаблоном компоновщика):

public RestTemplateBuilder(RestTemplateCustomizer... customizers) {
    Assert.notNull(customizers, "Customizers must not be null");
    this.detectRequestFactory = true;
    this.rootUri = null;
    this.messageConverters = null;
    this.requestFactorySupplier = null;
    this.uriTemplateHandler = null;
    this.errorHandler = null;
    this.basicAuthorization = null;
    this.restTemplateCustomizers = Collections
            .unmodifiableSet(new LinkedHashSet<>(Arrays.asList(customizers)));
    this.requestFactoryCustomizers = Collections.emptySet();
    this.interceptors = Collections.emptySet();
}

И кажется, что класс, по-видимому, должен быть неизменным.
Поэтому любые методы, определенные в RestTemplateBuilder, которые изменяют текущее состояние, не возвращают this, но создают новый экземпляр с примененным изменением.

Аналогично тому, что делают неизменные классы, такие как LocalDate или String.

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