【问题标题】:Reusing constructors with final instance fields使用最终实例字段重用构造函数
【发布时间】:2010-02-24 11:19:28
【问题描述】:

假设我有以下试图不可变的类

    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 的 final 修饰符并保留两个构造函数的情况下实现此行为?

也就是说,不做类似的事情

       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);
    }

}

【问题讨论】:

    标签: java constructor final


    【解决方案1】:

    是的 - 反转逻辑,以便您的构造函数具有更少参数调用具有更多的构造函数:

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

    基本上这样你就可以得到相当多的构造函数,它们都只是委托给一个“真正的”构造函数来完成所有的实际工作。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2021-04-01
    • 2016-01-26
    • 2015-05-21
    • 1970-01-01
    • 2013-03-05
    • 2017-01-23
    相关资源
    最近更新 更多