Ответ 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!
}
Возможный дубликат:
Как обрабатывать статический инициализатор конечного поля, который выдает проверенное исключение
В этом примере я получаю ошибку. Пустое конечное поле 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
}
}
Есть ли какое-либо решение этой проблемы?
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!
}
Здесь решение:
private final static MyClass myClass = buildInstance();
private static MyClass buildInstance() {
try {
MyClass myClass = new MyClass();
myClass.init();
return myClass;
} catch (Exception e) {
return null;
}
}
Если ваш класс является окончательным, он не может изменять значения после его инициализации.
То, что вы делаете во втором фрагменте, состоит в том, что вы сначала назначаете его new MyClass()
, а затем, если исключение выбрано в init()
, вы затем меняете его на null
.
Это запрещено. Если new MyClass()
не выбрасывает исключение, почему бы вам не поместить его в верхнюю строку?
Предупреждение, однако, что если init()
выбрасывает исключение, вы по-прежнему будете иметь unintialized экземпляр MyClass
. Не похоже, что способ работы с этим классом соответствует тому, как он работает.