Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过setter设置最终字段?_Java_Class Design_Final - Fatal编程技术网

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