static final 変数の初期化

以下のようにstatic final な変数の初期化に失敗した場合にデフォルト値を代入しようとしても、
変数USER_IDが既に代入されている可能性があるためコンパイルエラーとなる。

public class UnwelcomeGuest {
    public static final long GUEST_USER_ID = -1;

    private static final long USER_ID;
    static {
        try {
            USER_ID = getUserIdFromEnvironment();
        } catch(Exception e) {
            USER_ID = GUEST_USER_ID;
        }
    }
        ・・
}


この場合には、static 初期化ブロックをヘルパメソッドとして実装すると良い。

public class UnwelcomeGuest {
    public static final long GUEST_USER_ID = -1;

    private static final long USER_ID = getUserIdOrGuest();
    private static long getUserIdOrGuest() {
        try {
            return getUserIdFromEnvironment();
        } catch(Exception e) {
            return GUEST_USER_ID;
        }
    }
        ・・
}