assign static final variable in a static try-catch

1.1k Views Asked by At

I want to read a property for config file and assign it to a static final variable and if in case the config file is omit/or not exists, using default value hard-coded.

public static final String NOTIFY_ALI;
static  {
    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        NOTIFY_ALI = notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");

    } catch (IOException e) {
        e.printStackTrace();
        NOTIFY_ALI = "http://notify.foo.com/notify";
    }
}

NOTIFY_ALI should be assigned by the configure file notify.conf with the key notify_ali or if it's not explicit in the file, take http://notify.foo.com/notify as a default value. And if the config file is not exists(IOException will occur), just catch the exception and assign with the default value as well.

But the upper code snippet give a compile time Err:

Error:(18, 13) java: variable NOTIFY_ALI might already have been assigned

Can I do this?

2

There are 2 best solutions below

4
On BEST ANSWER

Create a method that returns the URL and use to assign it when is declared

public static final String NOTIFY_ALI = getURL() ;

private static String getURL()
{ 
    String aux ;

    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        aux = notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");

    } catch (IOException e) {
        e.printStackTrace();
        aux = "http://notify.foo.com/notify";
    }
    return aux ; 
}

If you need to initialize more than one variable you could do it like this

public static final InitVariables IV = initVariables() ;

public class InitVariables {
    String NOTIFY_ALI ;
    String CONTACT_EMAIL ;
    int numEmployees ; 
}

private static InitVariables initVariables()
{ 
    InitVariables iv ;

    iv = new InitVariables() ;

    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        aux = notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");

    } catch (IOException e) {
        e.printStackTrace();
        aux = "http://notify.foo.com/notify";
    }

    iv.NOTIFY_ALI = aux ;

    iv.CONTACT_EMAIL = "[email protected]";
    iv.numEmployees = 0 ;

    return iv ; 
}
4
On

Why don't you remove the static initializer block and create a static method whose result is assigned to your static final variable?

public static final String NOTIFY_ALI = init();

private static String init() {
    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        return  notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");
    } catch (IOException e) {
        e.printStackTrace();
        return "http://notify.foo.com/notify";
    }
}