在Java中初始化最终变量的问题

fro*_*die 20 java final exception constants

我一直在努力解决Java中的一个问题并且它已经开始找到我了,我真的想不出一个正确的解决方法.

我有一个最终的对象属性,但是动态的.也就是说,我希望值在指定后保持不变,但每个运行时的值可以不同.所以我在类的开头声明了类级变量 - 比如说private final FILE_NAME;.然后,在构造函数中,我为它赋值 - 比方说FILE_NAME = buildFileName();

当我在buildFileName()抛出异常的方法中有代码时,问题就开始了.所以我在构造函数中尝试这样的东西:

try{
   FILE_NAME = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个错误 - "空白的最终字段FILE_NAME可能尚未初始化." 这是我开始对Java的严格编译器感到有些恼火的地方.我知道这不会是一个问题,因为如果它到达catch,程序将退出...但编译器不知道,因此不允许此代码.如果我尝试在catch中添加一个虚拟赋值,我会得到 - "可能已经分配了最终字段FILE_NAME." 我显然不能在try-catch之前分配一个默认值,因为我只能分配一次.

有任何想法吗...?

Rya*_*ins 20

怎么样

String tempName = null;
try{
   tempName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = tempName;
Run Code Online (Sandbox Code Playgroud)


Tom*_*ine 7

try {
   FILE_NAME = buildFileName();
} catch (Exception e){
   ...
   System.exit(1);
   throw new Error();
}
Run Code Online (Sandbox Code Playgroud)

或者有人喜欢:

private static final String FILE_NAME = fileName();

private static String fileName() {
    try {
        return buildFileName();
    } catch (Exception e){
        ...
        System.exit(1);
        throw new Error();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是调用System.exit静态初始化器可能是一个坏主意.它会破坏你的单元测试.


fro*_*die 4

转念一想,我想我刚刚想出了一个解决方案!- 使用中间变量。

String fileName = null;
try{
   fileName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = fileName;
Run Code Online (Sandbox Code Playgroud)

不知道为什么我花了这么长时间才想到这个……