I have a class like:
public class SomeClassImpl implements SomeClass { private static final SomeLib someLib = new SomeLib(); }
I can't do this because SomeLib throws a UnknownHostException.
I know I could move the instantiation to the constructor, but is there a way for me to do it the way I have it above somehow? That way I can keep the var marked as final.
I tried to look for how to throw exceptions at the class level but can't find anything on it.
You can use static initializer:
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; } }
Note that we need to use a temporary variable to avoid "variable someLib might not have been initialized" error and to cope with the fact that we can only assign someLib
once due to it being final
.
However, the need to add complex initialization logic and exception handling to static initializer is often a sign of a more fundamental design issue. You wrote in the comments section that this is a database connection pool class. Instead of using static final consider making it an instance variable. You can then do the initialization in a constructor or better yet in a static factory method.
You could use a static initializer:
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); } }
Note that your class won't be able to initialize if you do it so. Maybe you should try to initialize the lib lazily, when needed. Such class initialization exceptions are hard to diagnose, because they're transformed into ClassNotFoundException or NoClassDefFoundError (I don't remember which one)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With