我有以下缩写类:
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/