Как обеспечить порядок установки параметров через Pattern Builder - PullRequest
0 голосов
/ 01 января 2019

Недавно меня попросили в интервью реализовать шаблон Builder таким образом, чтобы пользователь не мог установить параметр B, если не установлен параметр A.

Я предложил передать A в качестве обязательного параметра при построенииСтроитель, но он не был удовлетворен моим ответом.Я также предложил бросить IllegelStateException, если A не установлен при установке B, но опять же он не был удовлетворен.Может ли кто-нибудь предложить, как мы можем заставить пользователя установить A, прежде чем он установит B?

class Example{
private int A;
private int B;

public static class Builder{
}

}

Ответы [ 2 ]

0 голосов
/ 01 января 2019

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

public class ExampleBuilderImpl implements  FullExampleBuilder {
private int a;
private int b;



public Example createExample() {
    return new Example(a, b);
}

@Override
public PartExampleBuilder setB(int b) {
    this.b = b;
    return this;
}

@Override
public FullExampleBuilder setA(int a) {
    this.a = a;
    return this;
}


public static void main(String[] args) {


    ExampleBuilderImpl builder = new ExampleBuilderImpl();

    // compiler error
   //       builder.setB(1).setA();

    builder.setA(1).setB(2);

}

}

public interface FullExampleBuilder extends PartExampleBuilder {
    FullExampleBuilder setA(int a);

}



public interface PartExampleBuilder {
    PartExampleBuilder setB(int b);
}
0 голосов
/ 01 января 2019

Чтобы сделать это в простом Java, вам нужно создать отдельные классы Builder, первый для установки A, после чего возвращаемое значение является экземпляром второго Builder, который предназначен для настройки B.

Oneиз ограничений этого подхода является то, что он очень многословный, и плохо масштабируется, чтобы иметь множество дополнительных параметров.

В качестве альтернативы, я сделал это, написав плагин компилятора (я использовал ОшибкаСклонен , поскольку это проще всего сделать с системой сборки Google, но нет никаких причин, по которым нельзя использовать другой инструмент), который проверяет порядок вызова метода.

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