Jak mogę odwołać się do mojego Java Enum bez określania jego typu

83

Mam klasę, która definiuje własne wyliczenie w następujący sposób:

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

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

Jeśli podam MyEnum.E1, to działa dobrze, ale naprawdę chciałbym mieć to jako „E1”. Masz jakiś pomysł, jak mogę to osiągnąć, czy też trzeba to zdefiniować w innym pliku, aby to zadziałało?

WNIOSEK: nie udało mi się uzyskać poprawnej składni importu. Ponieważ kilka odpowiedzi sugerowało, że jest to możliwe, mam zamiar wybrać tę, która dała mi potrzebną składnię, i zagłosować za innymi.

Nawiasem mówiąc, NAPRAWDĘ DZIWNA część tego (przed uruchomieniem importu statycznego), napisana przeze mnie instrukcja przełączająca, która używała wyliczenia, nie pozwalała na przedrostek wyliczenia według jego typu - cała reszta kod wymagał tego. Zranić mnie w głowę.

Bill K.
źródło
9
Odnośnie „naprawdę dziwnego” zachowania instrukcji switch: Java robi to na wszystkich wyliczeniach w instrukcji switch. Ponieważ wiesz, jaki typ włączasz, nie ma powodu, aby zmuszać Cię do ponownego określania typu w każdym bloku case. download.oracle.com/javase/tutorial/java/javaOO/enum.html
StriplingWarrior
1
Myślę, że dotarło do mnie, że nie pozwoliłoby to na przedrostek typu Enum. Wszędzie indziej prefiks jest wymagany (jeśli nie zaimportowany) lub opcjonalny.
Bill K
Zgadzam się z Tobą w odniesieniu do switchniespójności, sprawia, że ​​mniej doświadczeni programiści Java drapią się po głowach.
jmarkmurphy

Odpowiedzi:

135

Właściwie możesz wykonać statyczny import zagnieżdżonego wyliczenia. Poniższy kod kompiluje się dobrze:

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
źródło
1
Nawiązałem do tego jako rozwiązania w moim pytaniu, ale naprawdę wolałbym tego nie robić. Wyliczenia są używane tylko w tym jednym pliku. Wydaje się po prostu dziwne, że to nie działa automatycznie.
Bill K
Chociaż musisz użyć importu statycznego, nie musisz definiować go we własnej klasie.
Yishai
5
@Bill K, dlaczego myślisz, że to powinno działać automatycznie? Jak możesz się wtedy spodziewać, że to zadziała? klasa A {wyliczenie B {X, Y}; wyliczenie C {X, Z}; }
Kevin Bourrillion
3
To rozwiązanie działa tylko dlatego, że MyEnum jest widoczne poza Testem. Rozwiązanie nie zadziała, jeśli MyEnum jest np. Prywatne.
Chry Cheng,
2
Nie zapomnij o ostatniej części, symbole ". *" In "import statyczny mypackage.Test.MyEnum. *;" tak, jak ja zrobiłem!
joro
18

Możesz wykonać statyczny import zagnieżdżonej klasy:

import static apackage.Test.Enum.*;
Yishai
źródło
7

Klasa Test musi być zdefiniowana w pakiecie, aby można było ją importować.

Z pakietem zdefiniowanym w Test( TO DZIAŁA ):

package mypackage;

Możesz użyć:

import static mypackage.Test.MyEnum.*;

Bez zdefiniowanego pakietu nie możesz używać ( NIE DZIAŁA ):

import static Test.MyEnum.*;
Jayen
źródło