【发布时间】:2011-02-15 22:58:01
【问题描述】:
我一直在 Java 中遇到一个问题的细微变化,它开始困扰我,我真的想不出一个合适的方法来解决它。
我有一个最终但动态的对象属性。也就是说,我希望该值在分配后保持不变,但每个运行时该值可能不同。所以我在类的开头声明了类级变量——比如private final FILE_NAME;。然后,在构造函数中,我给它赋值——比如FILE_NAME = buildFileName();
当我在buildFileName() 方法中有引发异常的代码时,问题就开始了。所以我在构造函数中尝试这样的事情:
try{
FILE_NAME = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
现在我有一个错误 - “空白的最终字段 FILE_NAME 可能尚未初始化。”这就是我开始对 Java 的严格编译器有点恼火的地方。我知道这不会是一个问题,因为如果它被捕获,程序将退出......但编译器不知道这一点,因此不允许此代码。如果我尝试向 catch 添加一个虚拟分配,我会得到 - “最终字段 FILE_NAME 可能已经被分配。”我显然不能在 try-catch 之前分配默认值,因为我只能分配一次。
有什么想法吗...?
【问题讨论】:
-
你的意思是
private static final FILE_NAME;? -
@Tom Hawtin - 没有。为什么它应该是静态的?
-
我同意 Ryan 的回答(并适当投票)。我要说的一件事是......如果你不能初始化,你真的想要 System.exit 吗?也许最好的办法是让异常被抛出——不管怎样,如果它没有被处理,你仍然会退出,但是如果有一个处理机制,它可以被妥善处理。
-
@froadie:因为
ALL_CAPS表示常量(又名static final):java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367 -
@froadie:完全正确。至少 sun 命名约定说“变量声明的类常量”应该用
ALL_CAPS命名。其他字段,即使是final,也应该是camelCase,并带有一个小写的起始字符。
标签: java exception constants final