Использование шаблона Step Builder для создания сложного объекта, который содержит переменную экземпляра, которая является списком - PullRequest
0 голосов
/ 28 февраля 2019

Допустим, я хочу создать экземпляр следующего объекта:

private class ComplexObject {
    private int param1; // Required Parameter
    private int param2; // Required Parameter
    private int param3; // Required Parameter
    private List<Integer> listParam4; // This list should contain atleast one Integer

    private ComplexObject() {
        this.listParam4 = new ArrayList<Integer>();
    }
}

Я пытаюсь использовать шаблон Step Builder для создания этого объекта, чтобы пользователь устанавливал значение параметровс целью.Основная проблема, с которой я сталкиваюсь, заключается в создании интерфейса для последнего шага.Я хочу раскрыть метод build() после того, как пользователь предоставил хотя бы одно целое число, которое я могу добавить в listParam4.В то же время я также хочу дать пользователю возможность предоставить больше целых чисел для добавления в список перед вызовом метода build().Я был бы очень признателен, если бы кто-то мог предоставить мне способ сделать это или предложить альтернативный подход в случае, если я подхожу к этой проблеме неправильно.

Вот код, который мне в настоящее время необходим для достижения этой цели:

public interface SetParam1Step {
    SetParam2Step setParam1(int param1);
}

public interface SetParam2Step {
    SetParam3Step setParam2(int param2);
}

public interface SetParam3Step {
    AddToParam4ListStep setParam3(int param3);
}

public interface AddToParam4ListStep {
    // Not sure how to create this interface
}

public static class ComplexObjectBuilder implements SetParam1Step, SetParam2Step, SetParam3Step, AddToParam4ListStep {
    private int param1;
    private int param2;
    private int param3;
    private List<Integer> listParam4;

    private ComplexObjectBuilder() { 
        // Prevent Instantiation
    }

    @Override
    public AddToParam4ListStep setParam3(int param3) {
        this.param3 = param3;
        return this;
    }

    @Override
    public SetParam3Step setParam2(int param2) {
        this.param2 = param2;
        return this;
    }

    @Override
    public SetParam2Step setParam1(int param1) {
        this.param1 = param1;
        return this;
    }

    // Needs to implement the build() method and the methods that would eventually be added to the AddToParam4ListStep interface.

    public static SetParam1Step newInstance() {
        return new ComplexObjectBuilder();
    }
}

1 Ответ

0 голосов
/ 28 февраля 2019

AddToParam4ListStep должен просто иметь метод add(), возвращающий еще один интерфейс (AddToParam4ListOrBuild), который позволил бы add() больше параметров (возвращая себя) и построить конечный объект:

public interface AddToParam4ListStep {
    AddToParam4ListOrBuild add(Integer toAdd);
}

public interface AddToParam4ListOrBuild {
    AddToParam4ListOrBuild add(Integer toAdd);
    ComplexObject build();
}
...