列挙型コンストラクタが静的フィールド とそのメソッド内のメソッドにアクセスできない理由を理解しています。なぜそれがクラス内で が許可されているのですか?例えばSE次のコード、エンクロージングクラスのプライベート列挙型と静的フィールド
import java.util.ArrayList;
import java.util.List;
public enum Foo {
A("Some string"),
B("Some other string"),
;
static List<String> list = new ArrayList<>();
Foo(String description) {
list.add(description);
}
}
このコードは、コンパイル時エラーが発生しillegal reference to static field from initializer
。
関連する背景
静的フィールドはすべて 初期化されている前に、列挙型のコンストラクタが呼び出されます。上の例では、これはlist
がまだ初期化されていないことを意味します。静的フィールドは(section 12.4.2)
次に、テキスト順に、クラス変数初期化子及びクラスの静的 イニシャライザ、または インタフェースのフィールド初期化子のいずれかを実行する、などのテキスト ために初期化されるからです彼らは単一のブロックだった。
(強調鉱山)
と列挙型自体は常に静的フィールドを含む任意の他の のフィールドを、先行する値以来、彼らは 列挙型のコンストラクタに利用できない、何の静的フィールドが列挙型 をpreceedないこと、すなわち、値A
、およびB
です。
質問
しかし、ここで私の質問は、なぜそれがあることではあるenum
がかどうかにかかわらず列挙型の、 をその外側のクラスの静的フィールドにアクセスすることができます(クラスの内部に封入)「プライベート」前に表示---または--- 静的フィールドの後に?特に、Java仕様のどこにこれが指定されていますか?
import java.util.ArrayList;
import java.util.List;
public class Bar {
static List<String> first = new ArrayList<>();
enum Baz {
A("Some string"),
B("Some other string"),
;
Baz(String description) {
// Can access static fields from before the enum
first.add(description);
// Can access static fields from _after_ the enum
second.add(description);
}
}
static List<String> second = new ArrayList<>();
}
興味深い質問です。私は静的フィールドの初期化が正しい前に、あなたのコンストラクタが呼ばれているとは思わない。私はそれがむしろ反対であると思う。証明書のソート:http://stackoverflow.com/questions/36407743/enum-based-table-matrix-in-java –
@SotiriosDelimanolis実際にenum定数のリストは、enumのコンストラクタを使用して作成されたオブジェクトのリストです。 –
@SotiriosDelimanolisの例が提供されました。ありがとうございます。そしてごめんなさい。 –