2009-11-04 9 views
62

Mam klasy, który definiuje własne wyliczenia tak:Jak mogę odwołać mój Java Enum bez określenia jego typu

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

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

Gdybym określić MyEnum.E1 to działa dobrze, ale ja naprawdę tak jak mieć to jako "E1". Każdy pomysł, w jaki sposób mogę to osiągnąć, lub czy musi być zdefiniowany w innym pliku, aby to działało?

WNIOSEK: Nie udało mi się uzyskać poprawnej składni importu. Ponieważ kilka odpowiedzi sugerowało, że jest to możliwe, wybiorę tę, która dała mi składnię, której potrzebowałem, i poparłem pozostałe.

Nawiasem mówiąc, NAPRAWDĘ CZĘŚCIOWĄ część tego (zanim dostałem statyczny import do pracy), napisana przeze mnie instrukcja switcha, która używała enum, nie pozwalała na wyliczenie enum przez jego typ - wszystko reszta kodu tego wymagała. Zranić moją głowę.

+6

Jeśli chodzi o zachowanie "naprawdę dziwne" w instrukcjach przełączania: Java robi to na wszystkich wyliczeniach w instrukcji switch. Ponieważ wiesz, jaki typ włączasz, uważają, że nie ma powodu, aby ponownie określić typ w każdym bloku sprawy. http://download.oracle.com/javase/tutorial/java/javaOO/enum.html – StriplingWarrior

+1

Domyślam się, że zrozumiałem, że nie zezwala na prefiks typu Enum. Prefiks w dowolnym miejscu jest wymagany (jeśli nie importowany) lub opcjonalny. –

+0

Zgadzam się z tobą w odniesieniu do niespójności 'switch', sprawia, że ​​mniej doświadczeni programiści Javy drapią się po głowie. – jmarkmurphy

Odpowiedz

100

W rzeczywistości można wykonać static import zagnieżdżonego wyliczenia. Poniższy kod kompiluje grzywny:

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) {} 
} 
+1

Nawiązałem do tego jako rozwiązania w moim pytaniu, ale wolałbym tego nie robić. Wyliczenia są używane tylko w tym jednym pliku. Wydaje się dziwne, że to nie działa automatycznie. –

+0

Mimo że musisz użyć importu statycznego, nie musisz go definiować we własnej klasie. – Yishai

+0

Próbowałem na kilka sposobów i nie mogę uzyskać statycznego importu, aby poprawnie rozwiązać, gdy odnosi się do klasy wewnątrz klasy, wykonującej import. –

13

Można zrobić statyczny import na zagnieżdżonej klasy:

klasa
import static apackage.Test.Enum.*; 
4

Test musi być zdefiniowany w pakiecie być importable.

z pakietem określonym w Test (IT WORKS):

package mypackage; 

Można użyć:

import static mypackage.Test.MyEnum.*; 

Bez pakietu zdefiniowane, nie można użyć (NIE DZIAŁA):

import static Test.MyEnum.*; 
Powiązane problemy