Моя точка зрения о том, что подкласс создает исключение, выглядит следующим образом:
public class Parent {
private final InputStream stream;
public Parent() {
stream = new FileInputStream(...);
}
public void close() throws IOException {
stream.close();
}
}
public class Child extends Parent {
public Child() {
// Implicit call to super()
if (someCondition) {
throw new RuntimeException();
}
}
}
Теперь класс Child
действительно должен вызвать close()
, если он собирается броситьисключение.Конечно, если close()
переопределено еще одним уровнем наследования, это может также вызвать проблемы.Еще один пример того, как наследование становится беспорядочным.
Я все еще думаю, что конструкторам, в принципе, нормально генерировать исключения.Даже ваша вторая ссылка была больше о злом способе захвата неуспешно сконструированного объекта, а не о том, что исключения конструктора являются злыми - это, безусловно, не дает никаких причин для того, чтобы не вызывать исключения из конструкторов.Это даже не создает беспорядочную ситуацию, о которой я говорил.
Фабричные методы могут потенциально помочь, но для вызывающего абонента результат тот же: они не доходят доувидеть частично построенный объект.Если вам действительно не понадобится для выполнения чего-то вроде очистки объекта, который был построен, но затем не прошел какой-либо элемент проверки, я не думаю, что это должно быть причиной для использования фабричных методов вместо конструкторов.(Есть другие причины для этого, но это другое дело.)