我在Java中遇到了一个问题的轻微变化,这让我很苦恼,我无法想出一个合适的方法来解决它。
我有一个对象属性是final但是动态的。也就是说,我希望一旦分配后,该值保持不变,但是每次运行时该值可以不同。因此,我在类的开头声明类级变量 - 比如 private final FILE_NAME;
。 然后,在构造函数中,我给它分配一个值 - 比如 FILE_NAME = buildFileName();
问题开始于在buildFileName()
方法中存在抛出异常的代码。所以我在构造函数中尝试像这样做:
try{
FILE_NAME = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
现在我遇到了一个错误 - "The blank final field FILE_NAME may not have been initialized."(空白终值FILE_NAME可能未初始化)。这时我开始对Java的严格编译器感到有点烦恼。我知道这不会成为问题,因为如果程序进入catch块,程序就会退出...... 但编译器并不知道这一点,所以不允许该代码。如果我尝试在catch块中添加虚拟赋值语句,则会得到"The final field FILE_NAME may already have been assigned."(最终字段FILE_NAME可能已经被分配)。很明显,我不能在try-catch之前分配默认值,因为我只能给它分配一次。
有什么建议吗...?
private static final FILE_NAME;
吗? - Tom Hawtin - tacklineALL_CAPS
表示常量(也称为static final
): http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367 - Joachim SauerALL_CAPS
命名。其他字段,即使是final
,也应该使用以小写字母开头的camelCase
。 - Joachim Sauer