Статические блоки выполняются в последовательном порядке? И что если это не блок?

Гарантированно ли работают эти строки со статическими инициализаторами по порядку? Потому что если нет, то все может пойти не так

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,

Другие вопросы по тегам