2010-09-08 6 views

Antwort

72

Denken Sie an Enums als eine Klasse mit einer endlichen Anzahl von Instanzen. Es kann niemals andere Instanzen neben den ursprünglich deklarierten geben.

Sie können also keinen öffentlichen oder geschützten Konstruktor haben, da dadurch mehr Instanzen erstellt werden können.

Hinweis: Dies ist wahrscheinlich nicht der offizielle Grund. Aber es macht am meisten Sinn für mich, auf diese Weise an enums zu denken.

+10

Es macht sehr viel Sinn. Aber warum sollte "default" erlaubt sein? Denn dann können auch andere Klassen im selben Paket den Konstruktor aufrufen. –

+0

@Anita, bist du sicher Standard ist erlaubt? – jjnguy

+1

Ja.Ich habe das Codebeispiel im OP kompiliert und ausgeführt. Keine Fehler. Aber das Seltsame ist, dass ich den Konstruktor immer noch nicht manuell aufrufen kann, auch nicht mit der Standardeinstellung. Ich dachte, Standard bedeutet, solange Sie im selben Paket sind, können Sie darauf zugreifen? Fehle ich etwas Großes hier? –

16

Weil Sie den Konstruktor nicht selbst aufrufen können.

Hier ist, was die tutorials on Enums zu sagen hat:

Hinweis: Der Konstruktor für einen Aufzählungstyp Paket-private oder privaten Zugang sein muss. Es erstellt automatisch die Konstanten, die am Anfang des Enum-Körpers definiert sind. Sie können einen Enum-Konstruktor nicht selbst aufrufen.

+0

Aus dem Link Daniel stammt "Hinweis: Der Konstruktor für einen Enum-Typ muss package-private oder private access sein. Er erstellt automatisch die am Anfang des Enum-Body definierten Konstanten. Sie können einen Enum-Konstruktor nicht selbst aufrufen . " Da Sie es nicht selbst anrufen können, ist es egal, warum es paket-privat sein kann. – Syntax

+8

Auf der anderen Seite erklärt diese Einschränkung nicht wirklich * warum * wir können keine öffentlichen oder geschützten Enum-Konstruktoren haben. Es ist ein wenig komisch und inkonsistent, zwei Zugriffsmodifizierer von vier zuzulassen; Es wäre sinnvoller, alle Zugriffsmodifizierer zuzulassen (weil Sie den Konstruktor immer noch nicht aufrufen können) oder einfach nur einen zuzulassen (die besten Kandidaten sind "privat" - um darauf hinzuweisen, dass auf diesen nicht von anderswo zugegriffen werden kann - oder vielleicht Standard) , um das Code-Rauschen zu reduzieren). – gustafc

+1

@gustafc: meine Gefühle genau! –

6

Enums enthalten eine feste Menge von Werten, die alle zur Kompilierungszeit bekannt sein müssen. Es ist nicht sinnvoll, zur Laufzeit neue Literale zu erstellen, was möglich wäre, wenn der Konstruktor sichtbar wäre.

-3

Wenn Sie enum public deklarieren möchten, speichern Sie die Datei enum mit dem Namen enum.

Angenommen, Sie eine Enumeration machen Book{} dann durch Book.java speichern und eine separate Datei für die Klasse

dies ist der einzige Weg enum Öffentlichkeit zu erklären, machen.

+3

Die Frage war über den Konstruktor, nicht die Enum selbst. – madth3

0

Der entscheidende Punkt zu erinnern ist, dass ein Aufzählung, die in einer Klasse nicht kann eingeschlossen nur mit dem öffentlichen oder Standard Modifikator deklariert werden, wie eine nicht-innere Klasse.

+0

Auch hier handelt es sich um enum * constructors *, nicht um die Enum-Typen selbst. –

Verwandte Themen