Возможный дубликат:
Анонимные кодовые блоки в Java
Я просто натолкнулся на следующее.
if ( test ) {
{
// statements 1
}
{
// statements 2
}
}
Это первый раз, когда я это видел. Как это работает?
Возможный дубликат:
Анонимные кодовые блоки в Java
Я просто натолкнулся на следующее.
if ( test ) {
{
// statements 1
}
{
// statements 2
}
}
Это первый раз, когда я это видел. Как это работает?
Он просто пишет два разных блока кода, чтобы скрыть локальные переменные.
Из ответа на вопрос "Анонимные кодовые блоки в Java:
Блокирует ограничение области видимости.
public void foo() { { int i = 10; } System.out.println(i); // Won't compile. }
На практике, однако, если вы обнаружите, что используете такой блок кода, это, вероятно, признак того, что вы хотите реорганизовать этот блок на Метод.
Два примера, где это может быть (слегка) полезно - в модульных тестах и в графических интерфейсах, которые часто включают повторяющийся код:
Это полезно в создании GUI, где невероятно легко вырезать и вставлять строки, относящиеся к одному компоненту, и забывать обновлять их для нового компонента, что приводит к труднодоступным ошибкам, например:
JButton button1 = new JButton("OK");
button1.setEnabled(false);
button1.setAlignmentX(-1);
JButton button2 = new JButton("Apply");
button1.setEnabled(false);
button1.setAlignmentX(-1);
К сожалению, я только что сконфигурировал button1
дважды. Если вы поместите каждую кнопку в свой собственный блок, то эта ошибка подхвачена компилятором. Опять же, вы можете создать каждую кнопку в отдельном методе, но это может затруднить просмотр происходящего (особенно учитывая отсутствие параметров ключевых слов в Java):
JButton button_ok = makeButton("OK", false, -1);
JButton button_apply = makeButton("Apply", true, 1);
// what exactly is being set here?
...
// much later:
private static JButton makeButton(String name, boolean enabled,
int alignment)
{
JButton button = new JButton(name);
button.setEnabled(enabled);
button.setAlignmentX(alignment);
return button;
}
... и вы можете получить множество методов, каждый из которых обрабатывает различные варианты параметров, и каждый из них может использоваться, возможно, дважды.
Два блока независимы. Таким образом, любые переменные, которые могут иметься в первом блоке, не будут доступны во втором блоке - или где-либо вне первого блока. Он называл изоляцию кода или область охвата.
{}
вводит область и переменные, объявленные в пределах области действия, существуют только для этой области. Например:
if ( test ) {
int i = 0;
float i = 0;
}
не удалось скомпилировать, поскольку i
был объявлен дважды в той же области.
if ( test ) {
{
int i = 0;
}
{
float i = 0;
}
}
будет компилироваться отлично, поскольку i
не был объявлен дважды в той же области.
Ничего. Они объявляют блоки кода. Обычно вы их не использовали. Единственная разница будет заключаться в том, что если вы объявите переменную в первом, она не будет доступна во втором.
Два блока выполняются последовательно. Каждый блок определяет новую область для локальных переменных. Таким образом, вы могли бы
int i;
в обоих блоках.
Это анонимные блоки. Они используются для ограничения объема. Не только в java, но и на других языках, таких как С# и C.