new ArrayList<>() {{
add("John");
System.out.println(NAMES);
}};
По существу можно рассматривать как
new MyList();
, где MyList
определяется как:
class MyList extends ArrayList<String> {
public MyList() {
super();
add("John");
System.out.println(NAMES);
}
}
Порядок событий идет:
- Позвонить конструктору
- Назначить объект, возвращаемый конструктором, в статическое поле с именем 'NAMES'
Так как System.out.println
происходит в конструкторе , вызов его с помощью NAMES
означает, что присвоение еще не произошло и не работает, но вызов его с помощью this
допустим.
Вы должны предпочесть одно из следующего (в зависимости от версии Java и количества элементов):
private static final List<String> NAMES = Arrays.asList("John");
private static final List<String> NAMES = List.of("John");
private static final List<String> NAMES = Collections.singletonList("John");
с последующим статическим блоком для печати:
static {
System.out.println(NAMES);
}