Sind enum-Instanzen im enum-Typ in Java "eingeschlossen"?

8

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?

    
Mr_and_Mrs_D 19.10.2013, 10:56
quelle

1 Antwort

3

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):

%Vor%

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:

%Vor%

Und wie Sie wissen, erstellt eine Operation new mit einem Klassenkörper eine anonyme Klasse.

    
Tom Anderson 19.10.2013, 11:34
quelle