Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't define a private static final variable because it throws an exception

Tags:

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.

like image 935
Blankman Avatar asked Dec 03 '11 13:12

Blankman


2 Answers

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.

like image 92
Adam Zalcman Avatar answered Oct 16 '22 04:10

Adam Zalcman


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)

like image 22
JB Nizet Avatar answered Oct 16 '22 02:10

JB Nizet