В Скрытые особенности Java в верхнем ответе упоминается Двойная инициализация брекетов, с очень заманчивый синтаксис:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Эта идиома создает анонимный внутренний класс с только инициализатором экземпляра в нем, который "может использовать любые методы [...] в области содержимого".
Основной вопрос: насколько это звучит как неэффективно? Должно ли его использование ограничиваться одноразовыми инициализациями? (И, конечно, хвастаюсь!)
Второй вопрос: новый HashSet должен быть "this", используемый в инициализаторе экземпляра... может ли кто-нибудь пролить свет на механизм?
Третий вопрос: эта идиома слишком неясна для использования в производственном коде?
Резюме: Очень, очень хорошие ответы, спасибо всем. По вопросу (3) люди чувствовали, что синтаксис должен быть ясным (хотя я бы рекомендовал случайный комментарий, особенно если ваш код передаст разработчикам, которые могут быть не знакомы с ним).
В вопросе (1) сгенерированный код должен выполняться быстро. Дополнительные файлы .class действительно вызывают беспорядок в файле jar и медленный запуск программы (благодаря @coobird для измерения этого). @Thilo указала, что сбор мусора может быть затронут, а стоимость памяти для дополнительных загруженных классов может быть фактором в некоторых случаях.
Вопрос (2) оказался для меня самым интересным. Если я понимаю ответы, то, что происходит в DBI, заключается в том, что анонимный внутренний класс расширяет класс объекта, создаваемого новым оператором, и, следовательно, имеет значение "this", ссылающееся на создаваемый экземпляр. Очень аккуратно.
В целом, DBI поражает меня как нечто интеллектуальное любопытство. Coobird и другие отмечают, что вы можете добиться такого же эффекта с помощью методов Arrays.asList, varargs, коллекций Google и предлагаемых литератур Java 7 Collection. Новые языки JVM, такие как Scala, JRuby и Groovy, также предлагают краткие обозначения для построения списка и хорошо взаимодействуют с Java. Учитывая, что DBI загромождает путь к классам, замедляет загрузку классов немного, и делает код еще более неясным, я бы, вероятно, уклонился от него. Тем не менее, я планирую spring это на другом, который только что получил свой SCJP и любит добродушные шутки о семантике Java!;-) Спасибо всем!
7/2017: Baeldung имеет хорошее резюме инициализации двойной скобки и считает его анти-шаблоном.
12/2017: @Basil Bourque отмечает, что в новой Java 9 вы можете сказать:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Это точно путь. Если вы застряли в более ранней версии, посмотрите ImmutableSet Google Collections.