Каков этот вызов конструктора со следующими двойными фигурными скобками?

Можно сохранить учетные данные где угодно, включая как соединенные проводами строки в программе или как записи в реестре Windows. Вам решать для получения их, если Вы используете что-то нестандартное, хотя; я не знаю ни о каких предварительно прокрученных решениях, которые не являются простым текстом.

15
задан Paŭlo Ebermann 12 August 2011 в 01:32
поделиться

3 ответа

Это известно как инициализация двойной скобки :

Первая скобка создает новую AnonymousInnerClass, второй объявляет блок инициализатора экземпляра который запускается, когда анонимный внутренний создается экземпляр класса. Этот тип блок инициализатора формально называется "инициализатор экземпляра", потому что он объявлен в области действия экземпляра класса - «статические инициализаторы» связаны с концепцией, в которой ключевое слово static помещается перед скоба, которая начинает блок, и которая выполняется на уровне класса, как только когда загрузчик классов завершает загрузку класс (указанный в http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6 ) Блок инициализатора может использовать любой методы, поля и конечные переменные доступно в содержащей его области, но нужно опасаться того факта, что инициализаторы запускаются до конструкторы.

Это работает только для не финальных классов, потому что он создает анонимный подкласс.

21
ответ дан 1 December 2019 в 02:02
поделиться

Давайте немного по-другому разместим код:

MyTest tester = new MyTest() {
  {
    setName("John Johnson");
  }
};

То, что вы видите здесь, называется инициализацией двойных скобок . У вас есть анонимный внутренний подкласс класса MyTest вместе с блоком инициализатора, который представляет собой блок, содержащий код, который запускается при создании объекта.

Обычно вы помещаете такой код в конструктор, но поскольку анонимные внутренние классы не могут иметь конструкторов, это единственный способ гарантировать, что код запускается тогда, когда он должен.

Сказав это, это ' Это немного некрасиво. Есть способы получше. Тем не менее, я сам иногда использую его, обычно в следующей идиоме для создания неизменяемой карты:

final Map<String, Integer> textToInt = Collections.unmodifiableMap(new HashMap<String, Integer>() {{
    put("one", 1);
    put("two", 2);
    // etc
}});

Которая создает новую карту, переопределяет ее, добавляет к ней некоторые значения в блоке инициализатора и оборачивает ее в неизменяемую карту .

15
ответ дан 1 December 2019 в 02:02
поделиться
MyTest tester = new MyTest() {{
   setName("John Johnson");
}};

совпадает с

MyTest tester = new MyTest();
tester.setName("John Johnson");
-5
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: