Javaでは、コンストラクタの最初の行がsuperへの呼び出しである必要があります。暗黙的にsuper()を呼び出しているか、別のコンストラクタを明示的に呼び出していますか。私が知りたいことは、なぜその周りにtryブロックを置くことができないのでしょうか?私のsuper()コールの周りにtryブロックを使用できないのはなぜですか?
私の具体的なケースは、テスト用のモッククラスを持っていることです。デフォルトのコンストラクタはありませんが、テストをより簡単にするようにしたいと思います。私はまた、コンストラクタからスローされた例外をRuntimeExceptionにラップしたい。
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
しかし、Javaはスーパーが最初の文でないと文句を言い:
だから、私がやりたいことを効果的にこれです。
私の回避策:
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はモックを行うには、しかし...私は潜在的に矛盾した状態で構築されたオブジェクトを持たせたくないということである「なぜ」、私は気にしないととしての私の最高の推測そのことについて。私は上記を行うことができるはずです...少なくとも、私は上記が私の場合には安全であることを知っています...またはそれがとにかくあるべきであるかのように見えます。
私がテストしたクラスから使用するメソッドをオーバーライドしているため、初期化されていない変数を使用するリスクはありません。
興味深いことに、これは純粋にJava言語の制限です。同等のバイトコードは完全に有効です。 – Antimony
バイトコードはまだ有効ですか?私は、以下に説明する結果のセキュリティホールを誰かが悪用した後、無効になることを思い出します。 – Joshua
ルールで許可されていないためです。 [JDK仕様](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10)をお読みください。たとえあなたがコンパイラを通過したとしても、検証者はそれを拒否します。 –