Warum sind private Felder, die auf einem enum-Typ sichtbar auf die enthaltende Klasse?
public class Parent {
public enum ChildType {
FIRST_CHILD("I am the first."),
SECOND_CHILD("I am the second.");
private String myChildStatement;
ChildType(String myChildStatement) {
this.myChildStatement = myChildStatement;
}
public String getMyChildStatement() {
return this.myChildStatement;
}
}
public static void main(String[] args) {
//Why does this work?
System.out.println(Parent.ChildType.FIRST_CHILD.myChildStatement);
}
}
Gibt es zusätzliche Regeln in Bezug auf die Zugriffskontrolle für Eltern Unterklassen, Klassen innerhalb des gleichen package, etc., in Bezug auf dieses enum? Wo könnte ich finden diese Regeln in die spec?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hat nichts damit zu tun, dass es eine enum - es hat alles mit einem privaten Zugang von einem übergeordneten Typ, um ein nested type.
Aus der Java language specification, Abschnitt 6.6.1:
Beispielsweise ist dies auch gültig:
Interessanterweise, C# arbeitet in einer etwas anderen Weise - in C# ein privates Mitglied ist nur zugänglich im Programm-text der Art, auch von solchen verschachtelte Arten. Also die oben genannten Java-code, der nicht funktionieren würde, aber dieser wäre:
... aber wenn Sie ändern Sie einfach die Konsole.WriteLine-System.aus.println dieses hat kompilieren in Java. Also Java ist im Grunde ein bisschen mehr lax mit den privaten Mitgliedern als C# ist.
Weil die enum ist effektiv ein inner Klasse der Eltern.
Einer top-level-Klasse ist wie ein Dorf, jeder kennt jeden, es gibt keine Geheimnisse. Verschachtelte Einheiten innerhalb es nicht ändern, dass tatsächlich.