Я думаю, что вы и / или другие ответы путаете две разные синтаксические конструкции; а именно инициализаторы и блоки экземпляров. (И, кстати, «именованный блок» на самом деле является помеченным оператором, где оператор оказывается блоком.)
Инициализатор экземпляра используется на синтаксическом уровне члена класса; например,
public class Test {
final int foo;
{
// Some complicated initialization sequence; e.g.
int tmp;
if (...) {
...
tmp = ...
} else {
...
tmp = ...
}
foo = tmp;
}
}
Конструкция Initializer чаще всего используется с анонимными классами в соответствии с примером @ dfa. Другой вариант использования для сложной инициализации атрибутов final; например см. пример выше. (Тем не менее, чаще это делается с помощью обычного конструктора. Приведенный выше шаблон чаще используется со статическими инициализаторами.)
Другая конструкция является обычным блоком и появляется внутри блока кода, такого как метод; например, * +1008 *
public void test() {
int i = 1;
{
int j = 2;
...
}
{
int j = 3;
...
}
}
Блоки чаще всего используются как часть управляющих операторов для группировки последовательности операторов. Но когда вы используете их выше, они (просто) позволяют вам ограничивать видимость объявлений; например j
в приведенном выше.
Как правило, это означает, что вам необходимо провести рефакторинг кода, но это не всегда ясно. Например, вы иногда видите подобные вещи в интерпретаторах, написанных на Java. Операторы в плечах переключателя могут быть разделены на отдельные методы, но это может привести к значительному снижению производительности для «внутреннего цикла» интерпретатора; например,
switch (op) {
case OP1: {
int tmp = ...;
// do something
break;
}
case OP2: {
int tmp = ...;
// do something else
break;
}
...
};