Повторное использование конструкторов с полями конечного экземпляра - PullRequest
4 голосов
/ 24 февраля 2010

Давайте предположим, что у меня есть следующий класс, который пытается быть неизменным

    public class Computation {

    private final Operation operation;
    private final double epsilon;

    public Computation(Operation operation) {
        this.operation = operation;
        //Default value
        epsilon = 0.01;

    }


    public Computation(Operation operation double epsilon) {
        this(operation);
        //Won't compile as epsilon is final and is set by the other constructor
        this.epsilon = epsilon;
    }
}

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

Так что вопрос:

Есть ли способ добиться такого поведения без удаления окончательного модификатора epsilon и сохранения двух конструкторов? То есть, не делая что-то вроде

       public class Computation {

        private final Operation operation;
        private final double epsilon;

        public Computation(Operation operation Double epsilon) {
            this(operation);
            this.epsilon = (epsilon == null) ? 0.01 : epsilon;
        }
    }

и без использования строитель

   public class Computation {

    private final Operation operation;
    private final double epsilon;

    private Computation(Builder builder) {
        this.operation = builder.operation;
        this.epsilon = builder.epsilon;

    }


    public static class Builder {

    private final Operation operation;
    //Default value
    private double epsilon = 0.01;

    public Builder(Operation operation) {
        this.operation = operation;
    }

    public Builder epsilon(double epsilon) {
         this.epsilon = epsilon;
         return this;
    }

    public Computation build() {
        return new Computation(this);
    }

}

1 Ответ

7 голосов
/ 24 февраля 2010

Да - измените логику так, чтобы ваш конструктор с меньше параметров вызывал тот с more :

public Computation(Operation operation) {
    this(operation, 0.01);
}

public Computation(Operation operation, double epsilon) {
    this.operation = operation;
    this.epsilon = epsilon;
}

По сути, таким образом вы можете получить довольно много конструкторов, которые все просто делегируют одному "реальному" конструктору, который выполняет всю реальную работу.

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