В Java можно будет объявлять локальные интерфейсы и перечисления

На сайте 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'е относятся к самим записям. Их мало, и они незначительны. Например, в новой версии убрано ограничение, что канонический конструктор записи обязательно должен быть публичным.

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2020