コンストラクターの呼び出しsuper()
は、コンストラクターの最初の行にする必要がありますか? もしそうなら、なぜですか?コンストラクターのパラメーターの計算など、コンストラクターを呼び出す前に単純な制限付きの計算を実行できないのはなぜですか?
クロージャー仕様で呼び出すことができる内部クラスコンストラクターの状況を見つけました:
class A {
class Inner1 {
Inner1() {
// do something
}
}
}
class B {
A a1 = new A();
A a2 = new A();
class Inner2 extends A.Inner1 {
Inner2(boolean sel) {
(sel?a1:a2).super();
}
}
}
このケースは、基底クラス コンストラクターの外側のインスタンスを選択できることを示しています。選択ロジックをそれほど制限する必要があるのはなぜですか? なんでこんなの書けないんだ
if( sel ) {
a1.super();
}
else {
a2.super();
}
添加
私の質問は、次のような場合に制限が発生する可能性があることを意味します。
public class Base {
private final String content;
public Base(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
public class Derived extends Base {
public Derived(String content) {
super(String.format("Current value of content is %s.", getContent()));
}
}
後者の場合、私は:
super()
1)最前列の条件を満たす
2) 工事順序違反
3) コンパイラ エラー「明示的にコンストラクターを呼び出している間はインスタンス メソッドを参照できません」が発生する
では、なぜ「最初の行の要件」を廃止して、最後のエラーのようなエラーだけに頼ることができないのでしょうか?