Итак, в Java первая строка вашего конструктора HAS должна быть вызовом super... будь то неявным вызовом super() или явным вызовом другого конструктора. Я хочу знать, почему я не могу поставить блок try вокруг этого?
В моем конкретном случае у меня есть класс-макет для теста. Нет конструктора по умолчанию, но я хочу, чтобы тесты проще читать. Я также хочу, чтобы исключение, исключенное из конструктора, в RuntimeException.
Итак, что я хочу сделать, это эффективно:
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
Но Java жалуется, что super не является первым утверждением.
Мое обходное решение:
public class MyClassMock extends MyClass {
public static MyClassMock construct() {
try {
return new MyClassMock();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public MyClassMock() throws Exception {
super(0);
}
// Mocked methods
}
Это лучшее обходное решение? Почему Java не позволяет мне делать первый?
Мое лучшее предположение относительно "почему" заключается в том, что Java не хочет позволять мне иметь построенный объект в потенциально несогласованном состоянии... однако, делая макет, мне все равно. Кажется, я должен быть в состоянии сделать выше... или, по крайней мере, я знаю, что вышеописанное безопасно для моего дела... или кажется, что это должно быть в любом случае.
Я переопределяю любые методы, которые я использую из тестируемого класса, поэтому нет риска, что я использую неинициализированные переменные.