Я знаю, что это старый вопрос, но мне он понравился, и поэтому я решил дать ему собственный ответ. Возможно, мое понимание того, почему этого нельзя сделать, будет способствовать обсуждению и будущим читателям вашего интересного вопроса.
Позвольте мне начать с примера неудачной конструкции объекта.
Давайте определим класс A, такой что:
class A {
private String a = "A";
public A() throws Exception {
throw new Exception();
}
}
Теперь предположим, что мы хотим создать объект типа A в блоке try...catch
.
A a = null;
try{
a = new A();
}catch(Exception e) {
//...
}
System.out.println(a);
Очевидно, что вывод этого кода будет: null
.
Почему Java не возвращает частично созданную версию A
? В конце концов, к моменту отказа конструктора поле name
объекта уже было инициализировано, верно?
Ну, Java не может вернуть частично построенную версию A
, потому что объект не был успешно построен. Объект находится в несогласованном состоянии и поэтому отбрасывается Java. Ваша переменная A даже не инициализирована, она сохраняется как ноль.
Теперь, как вы знаете, чтобы полностью построить новый объект, все его суперклассы должны быть сначала инициализированы. Если один из суперклассов не будет выполнен, каково будет конечное состояние объекта? Это невозможно определить.
Посмотрите на этот более сложный пример
class A {
private final int a;
public A() throws Exception {
a = 10;
}
}
class B extends A {
private final int b;
public B() throws Exception {
methodThatThrowsException();
b = 20;
}
}
class C extends B {
public C() throws Exception { super(); }
}
Когда вызывается конструктор C
, если при инициализации B
возникает исключение, каким будет значение конечной int
переменной b
?
Таким образом, объект C не может быть создан, это поддельный, это мусор, он не полностью инициализирован.
Для меня это объясняет, почему ваш код недопустим.