私はこのコード静的イニシャライザで宣言の順序が重要なのはなぜですか?
private static Set<String> myField;
static {
myField = new HashSet<String>();
myField.add("test");
}
を持っており、それが動作します。しかし、私が注文を裏返すと、私は不正な前方参照エラーが発生します。
static {
myField = new HashSet<String>();
myField.add("test"); // illegal forward reference
}
private static Set<String> myField;
私は少しショックを受けよ、私は、Javaからこのような何かを期待していませんでした。 :)
ここではどうなりますか?宣言の順序が重要なのはなぜですか?なぜ代入は動作しますが、メソッド呼び出しは動作しませんか?
OK、わかりました。しかし、最初の割り当て後、myField *は初期化されます。なぜ私はまだaddメソッドを呼び出せないのですか? –
これらの3つの要件が存在しない場合は、イニシャライザでローカル変数を使用して暗黙的な前方参照を作成できますか?それがこれらの制限の理由ですか? –
ths JLSはこう言っています: "...これらの制限は、コンパイル時に循環型またはその他の形式の初期化をキャッチするように設計されています...." –