したがって、Javaでは、コンストラクターの最初の行はsuperの呼び出しである必要があります...暗黙的にsuper()を呼び出す場合でも、明示的に別のコンストラクターを呼び出す場合でも同じです。私が知りたいのは、なぜその周りにトライブロックを配置できないのですか?
私の特定のケースは、テスト用のモッククラスがある場合です。デフォルトのコンストラクターはありませんが、テストを読みやすくするためのコンストラクターが必要です。また、コンストラクターからスローされた例外を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が、潜在的に矛盾した状態の構築されたオブジェクトを私に持たせたくないということです...しかし、モックを行う際には、私はそれを気にしません。私は上記を行うことができるはずです...または少なくとも私は上記が私の場合には安全であることを知っています...またはとにかくそうあるべきであるように見えます。
テストされたクラスから使用するメソッドをオーバーライドしているので、初期化されていない変数を使用しているリスクはありません。