Когда вы хотите инициализировать одну или несколько статических переменных в одном месте
Это полезно, потому что вы можете применить обработку исключений, что невозможно при встроенной инициализации.
Например:
public static ImageIcon defaultIcon = ImageIO.read(..);
можно инициализировать с помощью
public static ImageIcon defaultIcon;
static {
try {
defaultIcon = ImageIO.read(..);
} catch (IOException ex){
System.out.println("No default icon available");
}
}
Другое приложение - сложная инициализация. Например, если элемент требует более одной строки кода для инициализации. Допустим, у вас есть конфигурация:
public static Configuration configuration;
static {
confuguration = new Configuration();
configuration.setSomething(..);
configuration.setSomethingElse(..);
...
}
Третье использование - инициализация некоторой внешней инфраструктуры API. Один пример из моего текущего проекта:
static {
org.apache.xml.security.Init.init();
}
Но, как отметил Николай Голубев, блоки статической инициализации делают код менее читабельным, поэтому используйте их с осторожностью. статические методы делают то же самое более прозрачно.