Давайте раскроем код немного по-другому:
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
}});
, которая создает новую карту, переопределяет ее, добавляет к ней некоторые значения в блоке инициализатора и переносит ее в неизменяемую карту.