Java 如何通过setter设置最终字段?
我有以下简称课程:Java 如何通过setter设置最终字段?,java,class-design,final,Java,Class Design,Final,我有以下简称课程: public class Employee { private final float pointPosition; public Employee(float pointPosition) { this.pointPosition = pointPosition; } } 我想检查构造函数传入的点位置,以确保它不超过1.0 我尝试将赋值移动到它自己的私有setter方法,该方法执行先决条件检查,但显然这给了我一个错误,因为我正
public class Employee {
private final float pointPosition;
public Employee(float pointPosition) {
this.pointPosition = pointPosition;
}
}
我想检查构造函数传入的点位置
,以确保它不超过1.0
我尝试将赋值移动到它自己的私有setter方法,该方法执行先决条件检查,但显然这给了我一个错误,因为我正在构造函数外部重新分配final
字段
我可以将构造函数更改为如下内容:
public Employee(float newPointPosition) {
verifyPointPosition(newPointPosition); //Will throw
this.pointPosition = pointPosition;
}
但我更喜欢用它自己的方法把它整齐地包装起来
我的选项是什么?选项1:不要将其设为最终选项 你不能让它成为最后一场比赛,也不能让二传成为私人赛
选项2:在构造函数中进行检查和设置 这就是你已经展示的
选项3:黑客方式 您可以使用反射设置最终变量,但是我绝对不建议您这样做,除非您被迫这样做
我会选择第二种。如果您担心构造函数太乱,可以创建其他构造函数并将其设置为私有,例如:
公共类MyClass{
私有最终浮点变量;
公共MyClass(浮点变量){
这个();
if(变量<0.0f | 1.0f<变量)
抛出新的IllegalArgumentException(“'variable'必须介于0.0和1.0之间”);
this.variable=变量;
}
私有MyClass(){
//其他一切都安排好了
}
}
实际上,这段代码不会编译。我建议这样做,只需将参数段落包装在构造函数的单个方法调用中即可 您没有说明您想要什么行为,如果值无效,是否抛出异常,或者是否将其清理为正常值,但无论哪种方式都可以:
public class Employee
private static final float MAX_POSITION = 1.0f;
private final float pointPosition;
public Employee(float pointPosition) {
this.pointPosition = sanitizePointPosition(pointPosition);
}
然后你有两个选择:
private float sanitizePointPosition(float pointPosition) {
if(pointPosition > MAX_POSITION) {
throw new IllegalArgumentException("Point position must be <= "
+ MAX_POSITION + ", it was: " + pointPosition);
}
return pointPosition;
}
让verify方法只返回输入。我在C++中一直这样做members@Bwmat考虑把你的评论变成一个答案。请不要让任何人做“3”!tkausl选项2的示例实际上是选项1–
变量
不再是最终
,否则MyClass()
将无法编译。
private float sanitizePointPosition(float pointPosition) {
if(pointPosition > MAX_POSITION) {
throw new IllegalArgumentException("Point position must be <= "
+ MAX_POSITION + ", it was: " + pointPosition);
}
return pointPosition;
}
private float sanitizePointPosition(float pointPosition) {
return pointPosition > MAX_POSITION ? MAX_POSITION : pointPosition;
}