Javaでは、スーパーコンストラクタを実行する前にフィールドを初期化する方法はありますか?私は、コンパイラによって拒否さを考え出すことができるスーパーコンストラクタを実行する前にフィールドを初期化しますか?
でも醜いハック:
class Base
{
Base(String someParameter)
{
System.out.println(this);
}
}
class Derived extends Base
{
private final int a;
Derived(String someParameter)
{
super(hack(someParameter, a = getValueFromDataBase()));
}
private static String hack(String returnValue, int ignored)
{
return returnValue;
}
public String toString()
{
return "a has value " + a;
}
}
注:私は代表団への継承から切り替わったときに問題が姿を消したが、私はまだ知っていただきたいと思います。
フィールド 'a'をあらかじめ初期化しようとしていますか? – Woot4Moo
私はあなたがこれを行うことができるとは思わない。クラス内で行う初期化(コンストラクタの外にあっても)は、 'super'呼び出しの後にすべてのコンストラクタに移動されます。したがって、スーパーコンストラクタは常にフィールドの初期化の前に実行されます。 –
@FredOverflow 'a'は' Derived'でしかアクセスできないので、なぜ 'super()'が呼び出される前に初期化されるのが問題なのですか?直後に初期化しても、あなたの提供するサンプルに違いはありません(Baseコンストラクタからオーバーライドされたメソッドを呼び出す場合を除き、これはかなり嫌な臭いをします)。 – assylias