Для чего используется статический блок инициализации в Java?

«Для чего используется статический блок инициализации в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Статический блок инициализации (static {}) используется для выполнения кода один раз при первой загрузке класса в память JVM, до создания любого экземпляра или вызова статических методов/полей.

Основное назначение: сложная инициализация статических переменных (полей класса).

Пример: Инициализация статического Map или подключение драйвера БД.

public class DatabaseConfig {
    // Статическая коллекция для кэширования конфигураций
    private static final Map<String, String> CONFIG_CACHE;

    // Статический блок выполняется при загрузке класса DatabaseConfig
    static {
        System.out.println("Loading database configuration...");
        CONFIG_CACHE = new HashMap<>();

        // Имитация загрузки данных из файла или сети
        CONFIG_CACHE.put("db.url", "jdbc:mysql://localhost:3306/mydb");
        CONFIG_CACHE.put("db.user", "admin");

        // Регистрация драйвера БД (устаревший, но наглядный пример)
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("Database driver not found", e);
        }
    }

    public static String getConfig(String key) {
        return CONFIG_CACHE.get(key);
    }
}

Ключевые особенности:

  1. Время выполнения: Один раз при загрузке класса.
  2. Порядок: Выполняется после инициализации статических полей значениями по умолчанию (null, 0) и до конструкторов и нестатических блоков.
  3. Может быть несколько: Блоки выполняются в порядке их объявления в классе.
  4. Может выбрасывать исключения: Если в блоке возникнет ExceptionInInitializerError, класс становится непригодным для использования.

Когда использовать?

  • Для инициализации статических данных, требующих сложной логики (чтение файла, вычисления).
  • Для регистрации драйверов или сервисов.
  • Для установки статического контекста безопасности или логирования.