Записано примерно эквивалентным, более простым способом, ближе к байтовому коду, мы видим:
public final class Foo {
public static final Foo A = new Foo();
public static final Foo B = new Foo();
private Foo[] foos;
private Foo() {
this.foos = new Foo[] { Foo.A };
}
}
Вы можете видеть, что для инициализации A
мы вызываем конструктор, который читает A
.Очевидно, что пока еще в конструкторе A
не будет инициализирован.
(Оказывается, этот более простой код компилируется. Он просто не делает то, что вы ожидаете.)
Возможно, вы хотите Foo.values()
вместо foos
переменной экземпляра.