Ответ
Статический блок инициализации (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);
}
}
Ключевые особенности:
- Время выполнения: Один раз при загрузке класса.
- Порядок: Выполняется после инициализации статических полей значениями по умолчанию (null, 0) и до конструкторов и нестатических блоков.
- Может быть несколько: Блоки выполняются в порядке их объявления в классе.
- Может выбрасывать исключения: Если в блоке возникнет
ExceptionInInitializerError, класс становится непригодным для использования.
Когда использовать?
- Для инициализации статических данных, требующих сложной логики (чтение файла, вычисления).
- Для регистрации драйверов или сервисов.
- Для установки статического контекста безопасности или логирования.