无法定义私有静态最终变量,因为它会引发异常

2022-09-01 21:57:06

我有一个类,如:

public class SomeClassImpl implements SomeClass {
   private static final SomeLib someLib = new SomeLib();
}

我不能这样做,因为SomeLib抛出了一个UnknownHostException。

我知道我可以将实例化移动到构造函数,但是有没有办法让我以某种方式以我上面的方式做到这一点?这样,我就可以将 var 标记为 final。

我试图寻找如何在类级别抛出异常,但找不到任何内容。


答案 1

您可以使用静态初始值设定项:

public class SomeClassImpl implements SomeClass {
   private static final SomeLib someLib;
   static {
     SomeLib tmp = null;
     try {
       tmp = new SomeLib();
     } catch (UnknownHostException uhe) {
       // Handle exception.
     }
     someLib = tmp;
   }
}

请注意,我们需要使用临时变量来避免“变量 someLib 可能尚未初始化”错误,并处理由于它是 .someLibfinal

但是,需要向静态初始值设定项添加复杂的初始化逻辑和异常处理,这通常是更基本的设计问题的征兆。您在注释部分写道,这是一个数据库连接池类。与其使用静态 final,不如考虑使其成为实例变量。然后,您可以在构造函数中进行初始化,或者最好在静态工厂方法中进行初始化。


答案 2

您可以使用静态初始值设定项:

private static final SomeLib SOME_LIB; // respect naming conventions

static {
    try {
        SOME_LIB = new SomeLib();
    }
    catch (UnknownHostException e) {
        throw new RuntimeException("Class initialization failed due to UnknownHostException", e);
    }
}

请注意,如果这样做,您的类将无法初始化。也许你应该尝试在需要时懒惰地初始化lib。这样的类初始化异常很难诊断,因为它们被转换为ClassNotFoundException或NoClassDefFoundError(我不记得是哪一个)