在 Java 中初始化最终变量时出现问题

2022-09-02 03:42:40

我不断遇到Java中问题的轻微变化,它开始向我袭来,我真的想不出一个合适的方法来解决这个问题。

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

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

try{
   FILE_NAME = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}

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

任何想法...?


答案 1

怎么样

String tempName = null;
try{
   tempName = buildFileName();
}
catch(Exception e){
   ...
   System.exit(1);
}
FILE_NAME = tempName;

答案 2

try {
   FILE_NAME = buildFileName();
} catch (Exception e){
   ...
   System.exit(1);
   throw new Error();
}

或者有些人更喜欢:

private static final String FILE_NAME = fileName();

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

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


推荐