Статическое поле не может ссылаться до того, как оно определено или инициализировано:
static Integer j = i; /* compile error */
static final Integer i = 5;
Однако, когда он ссылается на блок инициализации экземпляра (в анонимном внутреннем классе), даже не генерируется предупреждение.
См. пример:
class StaticInitialization {
static final Object o = new Object() {{
j = i;
}};
static Integer j, k;
static final Integer i = 5;
static final Object o2 = new Object() {{
k = i;
}};
}
Результат: j == null
, k == 5
, поэтому мы четко сделали ссылку, зададим порядок и не обнаружили ошибку предупреждения или компиляции.
Является ли этот код законным?