Wie kann ich auf meine Java-Enumeration verweisen, ohne deren Typ anzugeben?

83

Ich habe eine Klasse, die ihre eigene Aufzählung wie folgt definiert:

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  // << Gives "E1 cannot be resolved" in eclipse.
    }
    public Test2(MyEnum e) {}
}

Wenn ich MyEnum.E1 spezifiziere, funktioniert es gut, aber ich möchte es wirklich nur als "E1" haben. Irgendeine Idee, wie ich das erreichen kann, oder muss es in einer anderen Datei definiert werden, damit dies funktioniert?

SCHLUSSFOLGERUNG: Ich konnte die Syntax für den Import nicht korrekt ermitteln. Da mehrere Antworten darauf hinwiesen, dass dies möglich ist, werde ich diejenige auswählen, die mir die benötigte Syntax gegeben hat, und die anderen positiv bewerten.

Übrigens, ein WIRKLICH SELTSAMER Teil davon (bevor ich den statischen Import zum Laufen brachte), eine switch-Anweisung, die ich geschrieben hatte und die die Aufzählung verwendete, erlaubte es nicht, der Aufzählung ihren Typ voranzustellen - den ganzen Rest der Code benötigt es. Tut meinem Kopf weh.

Bill K.
quelle
9
In Bezug auf das "wirklich seltsame" Verhalten der switch-Anweisungen: Java führt dies für alle Aufzählungen in einer switch-Anweisung aus. Da Sie wissen, welchen Typ Sie einschalten, gibt es keinen Grund, den Typ in jedem Fallblock erneut anzugeben. download.oracle.com/javase/tutorial/java/javaOO/enum.html
StriplingWarrior
1
Ich denke, was mich dazu gebracht hat, ist, dass das Präfix vom Typ Enum nicht zulässig ist. Überall sonst ist ein Präfix entweder erforderlich (falls nicht importiert) oder optional.
Bill K
Ich stimme Ihnen in Bezug auf die switchInkonsistenz zu, die weniger erfahrene Java-Programmierer dazu bringt, sich am Kopf zu kratzen.
jmarkmurphy

Antworten:

134

Tatsächlich können Sie einen statischen Import einer verschachtelten Aufzählung durchführen. Der folgende Code lässt sich gut kompilieren:

package mypackage;

import static mypackage.Test.MyEnum.*;

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  
    }

    public static void Test2(MyEnum e) {}
}
Pascal Thivent
quelle
1
Ich habe in meiner Frage darauf als Lösung angespielt, aber das würde ich wirklich lieber nicht tun. Die Aufzählungen werden nur in dieser einen Datei verwendet. Es scheint nur seltsam, dass dies nicht automatisch funktioniert.
Bill K
Obwohl Sie einen statischen Import verwenden müssen, müssen Sie ihn nicht in einer eigenen Klasse definieren.
Yishai
5
@ Bill K, warum sollte es deiner Meinung nach automatisch funktionieren? Wie würden Sie dann erwarten, dass dies funktioniert? Klasse A {Aufzählung B {X, Y}; Aufzählung C {X, Z}; }
Kevin Bourrillion
2
Diese Lösung funktioniert nur, weil MyEnum außerhalb von Test sichtbar ist. Die Lösung funktioniert nicht, wenn MyEnum z. B. privat ist.
Chry Cheng
2
Vergessen Sie nicht den letzten Teil, Symbole ". *" In "statisches mypackage.Test.MyEnum importieren. *;" wie ich es tat!
Joro
17

Sie können einen statischen Import für eine verschachtelte Klasse durchführen:

import static apackage.Test.Enum.*;
Yishai
quelle
5

Die Testklasse muss in einem Paket definiert sein, damit sie importiert werden kann.

Mit dem in Test( IT WORKS ) definierten Paket :

package mypackage;

Sie können verwenden:

import static mypackage.Test.MyEnum.*;

Ohne definiertes Paket können Sie nicht verwenden ( FUNKTIONIERT NICHT ):

import static Test.MyEnum.*;
Jayen
quelle