java - 如何通过 setter 设置最终字段?

标签 java class-design final

我有以下缩写类:

public class Employee {

    private final float pointPosition;

    public Employee(float pointPosition) {
        this.pointPosition = pointPosition;
    }

}

我想检查构造函数传入的 pointPosition,以确保它不超过 1.0。

我尝试将赋值移动到它自己的私有(private) setter 方法,该方法执行前提条件检查,但显然这给了我一个错误,因为我正在构造函数之外重新分配 final 字段。

我可以将构造函数更改为:

public Employee(float newPointPosition) {
    verifyPointPosition(newPointPosition); //Will throw
    this.pointPosition = pointPosition;
}

但我更愿意用它自己的方法将所有内容整齐地包裹起来。

我有哪些选择?

最佳答案

选项 1:不要将其设为最终版本

您可以不将其设为 final 并将 setter 设为私有(private)。


选项 2:在构造函数中进行检查和设置

这就是您已经展示的内容。


选项 3:骇人听闻的方式

您可以使用反射设置最终变量,但我绝对不会推荐您这样做,除非您被迫这样做。


我会选择选项 2。如果您担心您的构造函数变得太乱,您可以创建额外的构造函数并将它们设置为私有(private),例如:

public class MyClass {
    private final float variable;

    public MyClass(float variable) {
        this();
        if(variable < 0.0f || 1.0f < variable)
            throw new IllegalArgumentException("'variable' has to be between 0.0 and 1.0");
        this.variable = variable;
    }

    private MyClass() {
        //Set everything else
    }
}

实际上,这段代码不会编译。

关于java - 如何通过 setter 设置最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005450/

相关文章:

java - 我可以用另一个final定义一个final变量吗?

java - 将 Java 泛型参数类型限制为最终类的列表

java - 使用 Java 中的 QuickFix/J 查询远程服务器以获取仪器的位置

java - ParseException 尝试在插入数据库之前格式化日期

php - 为什么不能在类定义中包含 require* 语句?

uml - 类图 UML 的类

java - 我需要设置一个变量,但我也需要它是最终的。

java - 使用自定义适配器将 XML 中的数据解析为列表

java - 在 ViewRootImpl.java 中创建线程

TypeScript:命名空间与类