Что означает двойная инициализация в методах Java

#java #initialization

#java #инициализация

Вопрос:

Я использую двойную инициализацию в java только для классов, например: new ArrayList(){{add()}} Но недавно я по ошибке написал приведенный ниже код, и JVM не разозлилась на мою ошибку.

 public void test(){
    {
        {
            ....
        }
    }
}
  

После этого привел простой пример и увидел следующее, но все еще ничего не понял, ожидая порядка выполнения инструкций.

 public class HelloWorld{

     public static void main(String []args){
        HelloWorld hw=new HelloWorld();
        hw.test1();
        System.out.println("----------");
        hw.test2();
     }

    public void test1(){
        {
            {
                System.out.println("1");
            }
            System.out.println("2");
        }
        System.out.println("3");
    }

    public void test2(){
        System.out.println("a");
        {
            System.out.println("b");
            {
                System.out.println("c");
            }

        }

    }
}
  

Результат:

 1
2
3
----------
a
b
c
  

Итак, мой вопрос заключается в том, что означают двойные или тройные инициализации etc в Java?

Комментарии:

1. Вам следует настоятельно рассмотреть возможность вообще не использовать инициализацию в виде двойной фигурной скобки. Это обманчивая синтаксическая выдумка, которая открывает вам всевозможные проблемы, такие как сериализуемые ошибки, утечки памяти и т.д. Если вам нужен ArrayList с заданными элементами, используйте new ArrayList<>(Arrays.asList("your", "elements")) .

Ответ №1:

Это не инициализация в виде двойной фигурной скобки. Это оператор block. Из документов:

Блок представляет собой группу из нуля или более операторов между сбалансированными фигурными скобками и может использоваться везде, где разрешен один оператор.

Оператор block заключает операторы внутри него в другую область видимости. Итак, если вы сделали:

 public static int foo() {
    {
        int foo = 0;
    }
    return foo;
}
  

foo не будет находиться в области видимости в строке return foo; , и вы получите сообщение об ошибке


В вашем коде эти вложенные блоки не имеют значения, поскольку вы просто печатаете, но каждый блок будет иметь разную область видимости

Комментарии:

1. Спасибо. @gblodgett. Но все еще не понял, почему это существует. Когда этот блок кода может быть полезен?

2. @demdem Если вы подумаете об этом, if операторы, while циклы, for циклы и т.д., Все выполняют оператор или блок . Обычно блок используется в паре с этими конструкциями, но законно использовать их без