В Java исчезнет необходимость в генерации синтетических методов доступа между вложенными типами

Недавно было объявлено о готовности спецификации Nestmates – механизма для поддержки в JVM доступа одних вложенных типов к приватным членам других связанных вложенных типов. Соответствующий JEP был создан ещё в 2013 году, однако активная работа по нему началась относительно недавно в рамках проекта Valhalla.

Напомним, что по спецификации Java вложенные типы одного и того же родительского типа должны иметь неограниченный доступ ко всем приватным членам друг друга (полям, методам и конструкторам). Однако во время компиляции вложенные типы компилируются в отдельные class-файлы, а сейчас ограничения JVM таковы, что доступ между соседними типами ничем не отличается от доступа между обычными типами. Другими словами, попытка доступа к приватному члену класса-соседа во время исполнения выбросила бы IllegalAccessError.

Чтобы обойти это ограничение JVM, сейчас компилятору приходится вставлять в class-файлы искусственные методы с пакетной видимостью, которые являются мостами доступа к приватным членам. В то время как такие методы решают поставленную задачу, они слегка увеличивают размер скомпилированного приложения и могут сбивать с толку пользователей и инструменты, а также усложняют оптимизацию во время JIT-компиляции.

Целью JEP 181 является избавление от необходимости в генерации таких синтетических методов и предоставление возможности доступа к приватным членам напрямую. Для того чтобы реализовать это, в class-файлы будут введены специальные атрибуты NestHost и NestMembers, которые будут содержать информацию о классах и интерфейсах, разделяющих между собой доступ к приватным членам.

На текущий момент неизвестно, в какой релиз попадёт реализация Nestmates, однако точно можно сказать, что мы не увидим её в Java 10.

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

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