Reproduzierer:
%Vor%Warnung ausgegeben:
Der Zugriff auf die umschließende Methode w () aus den Typ-IDs wird durch eine synthetische Zugriffsmethode emuliert.
Ich verstehe, was synthetische Methoden sind - was ich nicht verstehe, ist, wie sie mit Enums ins Spiel kommen - ich würde erwarten, dass Enum-Instanzen alle privaten Methoden haben, die ich im Enum definiere. Sind Instanzen wirklich verschachtelte Klassen?
Eine enum-Instanz, die Methoden definiert, wie Ihr ID
hier ausführt, ist ein Singleton einer impliziten anonymen Unterklasse der enum-Klasse. Die normalen Zugriffsregeln gelten zwischen der Unterklasse und der Enum-Klasse. Daher ist ein synthetischer Accessor erforderlich, um private Features der Enum-Klasse zu sehen.
Für die Java-Sprachspezifikation müssen Enums verwendet werden Weg :
Der optionale Klassenrumpf einer Enum-Konstante definiert implizit eine anonyme Klassendeklaration (§ 15.9.5), die den unmittelbar einschließenden Enum-Typ erweitert. Der Klassenkörper unterliegt den üblichen Regeln anonymer Klassen ...
Es ist sicherlich so, wie sie tatsächlich implementiert werden. Im javac des JDK geschieht dies in JavacParser::enumeratorDeclaration
um Zeile 3344 (in dieser Version):
Die relevanten Bits dort sind, dass, wenn es eine linke geschweifte Klammer ( LBRACE
) in der Deklaration gibt, dann ein Klassenkörper für eine anonyme Klasse ( classOrInterfaceBody(...)
) geparst wird ( names.empty
), und dies ist dann Wird als Klassenkörper in einem Instanzerstellungsausdruck verwendet ( NewClass(..., body)
). Sie können die Kompilierung von JCNewClass
nodes verfolgen, wenn Sie möchten, aber es genügt zu sagen, wie es sein Javadoc macht, dass es Modelle:
Und wie Sie wissen, erstellt eine Operation new
mit einem Klassenkörper eine anonyme Klasse.
Tags und Links java enums jvm java-synthetic-methods