На сайте OpenJDK вышел новый черновик JEP с заголовком "Records (Second Preview)". В нём специфицируются некоторые изменения в записях по сравнению с первым preview, а также возможность объявлять в методах интерфейсы и перечисления.
Напомним, что в Java есть возможность объявлять классы прямо внутри методов и блоков. Такие классы называются локальными, и они могут захватывать effectively final переменные, объявленные выше в этом же методе или блоке. Пример объявления локального класса:
void m() { class Foo { … } }
С Java 14 появилась возможность также объявлять локальные записи. Особенность локальных записей заключается в том, что они неявно являются статическими в отличие от локальных классов, которые могут быть только нестатическими. Таким образом, локальные записи стали первым историческим примером статических деклараций внутри метода, которые до этого в Java были запрещены (локальные классы и переменные не могут быть статическими). Пример стал успешным: локальные записи ничему не противоречат и не нарушают никакую семантику. Такой успешный пример навёл на мысль о том, что нужно расширить поле возможных локальных статических деклараций на интерфейсы и перечисления:
void m() { enum Foo { A, B } interface Bar { Foo getFoo(); } }
По аналогии с локальными записями локальные интерфейсы и перечисления могут ссылаться только на объявленные выше локальные записи, интерфейсы и перечисления, но не на те, которые объявлены ниже. Также они могут ссылаться на самих себя.
Про возможность объявлять локальные статические классы пока ничего не сказано, однако в январе Brian Goetz написал письмо в рассылку, в котором он сказал, что конечной целью должна быть возможность вкладывать всё что угодно во всё что угодно. Это значит, что локальные статические классы могут появиться позже.
Остальные изменения в JEP'е относятся к самим записям. Их мало, и они незначительны. Например, в новой версии убрано ограничение, что канонический конструктор записи обязательно должен быть публичным.