java - 重用具有最终实例字段的构造函数

标签 java constructor final

假设我有以下类试图保持不变

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

}

最佳答案

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

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

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

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

关于java - 重用具有最终实例字段的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325498/

相关文章:

java - 如何使用 JUnit 4 在 Java 控制台应用程序中测试循环的 mainManu 方法?

c++ - C++ 中的惰性/多阶段构造

java - 最终类中的静态函数是否隐式最终?

java - private static final double 为 0

java - 我想将最终变量初始化为函数

java - isSubstring递归方法

java - 我应该如何将 jar 及其依赖项发布到 Artifactory?

c++ - 将类的每个实例添加到列表对象的构造函数

java - 如何使用文件作为参数创建 BufferedImage 的新类

java - 当工厂方法是默认(非静态)时,如何在Java中创建实例