Вы бы использовали вторую конструкцию, если хотите создать анонимный класс. если у вас есть метод, который принимает обратный вызов в качестве аргумента, вы можете указать реализацию встроенного обратного вызова, в отличие от присвоения ему имени и помещения его в отдельный файл или объявления его в другом месте того же файла.
Существует также трюк под названием инициализация двойной скобкой , где вы можете обойтись без синтаксиса для буквенных карт и списков, используя анонимные классы, например:
Map map = new HashMap() {{put("foo", 1); put("bar", 2);}};
Здесь вложенные фигурные скобки создают инициализатор экземпляра. Объект, связанный с map, не является HashMap, его класс является анонимным классом, расширяющим HashMap. (Это означает, что если у вас есть правило PMD о классах, которым нужно объявлять серийные идентификаторы, тогда оно будет жаловаться на это.)