Статические блоки выполняются в последовательном порядке? И что если это не блок?
Гарантированно ли работают эти строки со статическими инициализаторами по порядку? Потому что если нет, то все может пойти не так
public Class x {
private static final BasicDataSource ds = new BasicDataSource();
private static final JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
private static final SomeDao someDao = new SomeDao(jdbcTemplate);
}
Хорошо... Как насчет этого?
public Class x {
private static final BasicDataSource ds;
private static final JdbcTemplate jdbcTemplate;
private static final SomeDao someDao;
static {
ds = new BasicDataSource();
ds.setStuff("foo");
ds.setAnotherProperty("bar");
jdbcTemplate = new JdbcTemplate(ds);
SomeDao someDao = new SomeDao(jdbcTemplate);
}
}
1 ответ
Решение
Они будут выполняться в последовательном порядке, соответствующем тому, как они были перечислены в исходном коде.
Класс может иметь любое количество статических блоков инициализации, и они могут появляться в любом месте тела класса. Система времени выполнения гарантирует, что статические блоки инициализации вызываются в том порядке, в котором они появляются в исходном коде. Инициализация полей
Это можно наблюдать с помощью следующего кода:
private static A a1 = new A(0);
private static A a2 = new A(1);
private static A a3 = new A(2);
private static A a4 = new A(3);
private static A a5 = new A(4);
private static A a6 = new A(5);
public static void main (String args[]) { }
static class A {
public A (int a) {
System.out.print(a);
}
}
Для которого выход всегда 012345
,