Конечное поле может не быть/уже инициализировано

Возможный дубликат:
Как обрабатывать статический инициализатор конечного поля, который выдает проверенное исключение

В этом примере я получаю ошибку. Пустое конечное поле myClass может быть не инициализировано:

private final static MyClass myClass; // <-- error

static {
    try {
        myClass = new MyClass(); // <-- throws exception
        myClass.init();
    } catch (Exception e) {
        // log
    }
}

В этом примере я получаю ошибку. Конечное поле myClass может быть уже:

private final static MyClass myClass;

static {
    try {
        myClass = new MyClass(); // <-- throws exception
        myClass.init();
    } catch (Exception e) {
        myClass = null; // <-- error
        // log
    }
}

Есть ли какое-либо решение этой проблемы?

Ответ 1

private final static MyClass myClass;

static {
    MyClass my;
    try {
        my = new MyClass();
        my.init();
    } catch (Exception e) {
        my = null;
        // log
    }
    myClass = my; //only one assignment!
}

Ответ 2

Здесь решение:

private final static MyClass myClass = buildInstance();

private static MyClass buildInstance() {
    try {
        MyClass myClass = new MyClass();
        myClass.init();
        return myClass;
    } catch (Exception e) {
        return null;
    }
}

Ответ 3

Если ваш класс является окончательным, он не может изменять значения после его инициализации. То, что вы делаете во втором фрагменте, состоит в том, что вы сначала назначаете его new MyClass(), а затем, если исключение выбрано в init(), вы затем меняете его на null.

Это запрещено. Если new MyClass() не выбрасывает исключение, почему бы вам не поместить его в верхнюю строку?

Предупреждение, однако, что если init() выбрасывает исключение, вы по-прежнему будете иметь unintialized экземпляр MyClass. Не похоже, что способ работы с этим классом соответствует тому, как он работает.