Добавление синглтона в класс Builder

#java #singleton #builder

#java #синглтон #Конструктор

Вопрос:

У меня есть класс Builder, как показано ниже, но я понятия не имею, какой правильный способ заставить этот класс вести себя одноэлементно и в то же время оставаться моим шаблоном Builder. Используя какой-то «одноэлементный тип перечисления»? или какой-нибудь рекомендуемый способ?

 @AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class ClientMailAdapter {

public static ClientMailAdapter.WebLiteRequestBuilder builder() {
    return new ClientMailAdapter.WebLiteRequestBuilder();
}

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public static class WebLiteRequestBuilder {
    private Map<String, String> parameters;
    private String username;
    private String password;
    private Source source;

    public ClientMailAdapter.WebLiteRequestBuilder parameters(final Map<String, String> parameters) {
        this.parameters = parameters;
        return this;
    }

    public ClientMailAdapter.WebLiteRequestBuilder username(final String username) {
        this.username = username;
        return this;
    }

    public ClientMailAdapter.WebLiteRequestBuilder password(final String password) {
        this.password = password;
        return this;
    }

    public ClientMailAdapter.WebLiteRequestBuilder source(final Source source) {
        this.source = source;
        return this;
    }

    public ClientMailResult sendEmail() {
        return new ClientMailService().sendEmailXML(
                ClientRequest.builder()
                        .username(username)
                        .password(password)
                        .parameters(parameters)
                        .source(source)
                        .build());
    }
}

@AllArgsConstructor
@Getter
public enum Source {
    XXXXX("Source Name To Be Defined X");

    private final String name;

}
  

}

Комментарии:

1. Здесь есть несколько ошибок. Также почему вы хотите, чтобы это был синглтон? Планируете ли вы повторно использовать единый экземпляр для других операций?

2. Неясный вопрос. Вы пытаетесь создать синглтон из адаптера или builder? И почему? Голосование за закрытие как неясное. Кроме того, создание синглтона в целом и с помощью перечисления в частности, уже много-много раз рассматривалось в Stack Overflow. Выполните поиск перед публикацией.

3. Мне нужен шаблон builder, потому что мне нужно будет установить большое количество параметров. Тем временем мне нужен шаблон Singleton для клиента, который также использует этот класс.

Ответ №1:

Я не уверен, что это то, что вы пытаетесь сделать, но вот что: возможно, вам нужно отделить синглтон от builder. Создайте синглтон стандартным способом, записав перечисление с одним значением. Но вместо класса builder создайте класс configurator, который имеет разрешения на установку параметров для синглтона. Они оба должны находиться в одном пакете, так что вы можете сохранить установщики в синглтоне, доступные только конфигуратору. Конструктор не нужен, если вы создаете его только один раз. Это то, что вы имели в виду?