java - 如何通过二传手设置最终字段?

原文 标签 java class-design final

我有以下缩写类:

public class Employee {

    private final float pointPosition;

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

}

我想检查一下constructor传入的pointPosition,以确保它不超过1.0。
我试着将赋值移动到它自己的私有setter方法,该方法执行前置条件检查,但很明显,这给了我一个错误,因为我正在构造函数之外重新分配一个final字段。
我可以把构造器改成:
public Employee(float newPointPosition) {
    verifyPointPosition(newPointPosition); //Will throw
    this.pointPosition = pointPosition;
}

但我更愿意用它自己的方法把它包装整齐。
我在这里有什么选择?

最佳答案

选择1:不要做最后的决定
你不可能把它定下来,让setter成为私有的。
选项2:在构造函数中进行检查和设置
这就是你已经展示的。
选项3:老套的方式
你可以用反射设置最终变量,但是我绝对不建议这样做,除非你被迫这样做。
我同意选择2。如果您担心构造函数太乱,可以创建其他构造函数并将其设置为私有,例如:

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 - JDBC连接失败:java.sql.SQLException:通信链接失败:握手错误

java - 如何在Android缓存目录中存储文件?

java - 为什么Exception将Throwable作为构造函数参数而不是Exception?

java - 在Java中使用final关键字是否可以提高性能?

java - 尝试将ActionListener添加到buttonArray

java - 如何使用IntelliJ IDEA IDE将图像链接到HTML?

java - 如何从文本字段中读取文本并将其输入数据库表

java - 使用构造函数注入对为可测性而构建的类的正确设计

c# - 如何决定在应用程序中创建类。

java - 避免“可能的空指针访问”