Ответ 1
Разница в синтетических и мандатных модификаторах проста - мандат был объявлен неявно, а синтез не был явно или явно не объявлен. Были хорошие статьи, и в спецификации java есть подробное объяснение синтетического модификатора, который ранее был введен в java. Ниже детали, связанные с синтетикой, были извлечены из них из-за полноты деталей. Пожалуйста, найдите ссылки в конце.
Synthetic:
Атрибут Synthetic является атрибутом фиксированной длины в атрибутах таблицу структуры ClassFile, field_info или method_info (§4.1, §4.5, п. 4.6). Член класса, который не отображается в исходном коде должен быть отмечен с использованием атрибута Synthetic, иначе он должен иметь Установлен флаг ACC_SYNTHETIC. Исключение из этого требования методы, генерируемые компилятором, которые не рассматриваются как реализация артефакты, а именно метод инициализации экземпляра, представляющий по умолчанию конструктор языка программирования Java (§2.9), класс метод инициализации (§2.9) и Enum.values () и Enum.valueOf() методы. Java-классы, методы и поля Java для Java времени выполнения. Возможно, нам не нужно знать о их написать код.
Атрибут Synthetic был представлен в версии 1.1 JDK для поддержки вложенные классы и интерфейсы.
Атрибут Synthetic имеет следующий формат:
Synthetic_attribute { u2 attribute_name_index; u4 attribute_length; }
Элементы структуры Synthetic_attribute следующие:
attribute_name_index Значение элемента attribute_name_index должно быть допустимым индексом в таблице constant_pool. Постоянная_пустая запись при этом индекс должен быть структурой CONSTANT_Utf8_info (§4.4.7) представляя строку "Синтетический".
attribute_length Значение элемента attribute_length равно нулю. Пользы Java Synthetic • Это может быть полезно в сеансах отладки, когда мы увидеть эти синтетические вещи в трассе стека, мы можем понять, что это такое. • AOP, generics, enums использует синтез Java. • API отражения Java выдает метод проверки, является ли элемент синтетическим. • Регулярная java программа-программист не будет требовать синтетических для повседневной работы программирование. • Эти знания могут потребоваться в интервью, но не требует, чтобы вы использовали его в проекте. Когда синтетический создан? Когда закрытый класс обращается к частному атрибуту вложенный класс, компилятор Java создает синтетический метод для этого атрибут. Если в источнике есть метод геттера, то это синтетический метод не будет создан. Аналогично для конструктора внутренние классы также синтезируются. Есть много случаев, например, при создании синтетического поля или метода или класса.
Обязательная:
Открывающий пакет неявно объявлен в источнике модуля декларация. Эта зависимость была объявлена в объявлении модуля. Мандатная конструкция - это та, которая явно не заявлена в исходный код, но присутствие которого предусмотрено спецификацией. такие считается, что конструкция объявлена неявно. Один пример mandated element является конструктором по умолчанию в классе, который не содержит явные объявления конструктора. Еще один пример мандата construct - неявно объявленная аннотация для контейнера, используемая для хранения несколько аннотаций повторяемого типа аннотации. Пример:
Module claim requires mandated java.base
Строка 1. Определяет модуль, называемый требованием. В строке 2 определяется каждый модуль зависит от модуля java.base, кроме java.base. Это означает, что экспорт было объявлено неявно в объявлении исходного модуля.
Литература: