Необходимо создавать объекты со значением переменных-членов, но нельзя использовать конструктор с параметрами, а также нельзя использовать методы установки для переменных-членов - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю новую библиотеку, в которой у меня есть класс (UserResponse) с 6 строковыми переменными, у нас есть набор из 3 конструкторов с параметрами, с помощью которых мы сейчас создаем объекты. Первая версия lib успешно запущена, для 2-я версия lib Меня просят удалить все конструкторы класса UserResponse, но есть некоторые классы, которые используют параметризованный конструктор для создания объектов. Я не могу создать объект с использованием параметров по умолчанию и использовать setter для установки значений. Есть ли лучший способ создать объект с инициализированными параметрами.

    public class UserResponse{
    private String s1;
    private String s2;
    private String s3;
    private String s4;
    private String s5;
    private String s6;


    //getters and setters

    //Parameterized Constructors

    }

class SomeService{

public UserResponse someMethod(){
//business logic

return new UserResponse(value1, value2, value3);
}
}

1 Ответ

1 голос
/ 17 апреля 2019

Это зависит от способа использования вашего класса, для которого он был разработан.

  1. Если клиенты класса должны иметь возможность свободно создавать response, с установленными произвольными полями - шаблон builder будет удовлетворять потребности. Этот подход используется, например, в API модели Atlassian Confluence, посмотрите на метод builder () Content . Вы не можете создать Content напрямую (все конструкторы являются частными) или изменить его (без установщиков), поэтому вы строите это так:
Content.builder()
    .space(currentSpace)
    .parent(parentPage)
    .title(titleToUse)
    .type(ContentType.PAGE)
    .body(bodyToUse, ContentRepresentation.STORAGE)
    .build()

Строитель является внутренним и имеет доступ ко всем полям.

  1. Если количество вариантов использования для построения класса ограничено, тогда идея на основе factory подходит лучше:
Content::Factory::buildResponseForUseCase1(/* use case specific parameters set*/)
Content::Factory::buildResponseForUseCase2(/* list of parameters dictated by use case 2 */)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...