2011-12-12 13 views
28

Gdybym miał klasę w Javie tak:Używanie Java wyliczenia z różnych klas?

public class Test 
{ 
    // ... 
    public enum Status { 
     Opened, 
     Closed, 
     Waiting 
    } 
    // ... 
} 

A ja miałem inną klasę w innym pliku klasy (ale w ramach tego samego projektu/folderu):

public class UsingEnums 
{ 
    public static void Main(String[] args) 
    { 
     Test test = new Test(); // new Test object (storing enum) 

     switch(test.getStatus()) // returns the current status 
     { 
      case Status.Opened: 
       // do something 
      // break and other cases 
     } 
    } 
} 

chciałbym skutecznie mieć wyliczenie w jednej klasie, która jest używana w innej klasie (w moim przypadku, konkretnie w zestawie).

Jednak, gdy to zrobić, mam błąd jak:

nie może odnaleźć symbol - klasa status

Jak to naprawić?

+2

Wszystkie odpowiedzi wydawały się poprawne, ale kiedy to zrobiłem, zaczęło się pojawiać błąd "etykieta enum switch case musi być niekwalifikowaną nazwą stałej wyliczeniowej" i stwierdziłem, że po prostu usuwa wszystko przed stanem ('Status.Opened' został" Otwarty ") to naprawił. – Bhaxy

Odpowiedz

77

Przełącznik enum przypadek etykieta musi być niewykwalifikowany nazwą stałej ENUM:

switch (test.getStatus()) // returns the current status 
{ 
    case Opened: 
     // do something 
     // break and other cases 
} 

To nie ma znaczenia że jest zdefiniowany w ramach innej klasy. W każdym przypadku kompilator jest w stanie wywnioskować typ wyliczenia na podstawie instrukcji switch i nie potrzebuje stałych nazw do zakwalifikowania. Z jakiegokolwiek powodu używanie kwalifikowanych nazw jest nieprawidłową składnią.

Wymóg ten został określony przez JLS §14.11:

SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

(dzięki Mark Peters' related post na odniesienie.)

+4

Głosowanie - nauczyłem się czegoś nowego dzisiaj ... –

+1

@AmirAfghani - Prawie poszedłem tą samą trasą, jeśli spojrzysz na moją historię edycji :) Na szczęście testowałem ją i pamiętałem o wyliczeniach. –

+1

Due dilligence * robi * opłaca się;) –

2

NVM

Musi być całkowicie nieograniczone, kwalifikacje jest przez typ zmiennej switch() ED (w tym przypadku test.getStatus(), który jest Test.Status).


Twój Enum Status jest częścią class Test. Jako takie, trzeba go zakwalifikować:

Test test = new Test(); // new Test object (storing enum) 

    switch(test.getStatus()) // returns the current status 
    { 
     case Test.Status.Opened: 
      // do something 
     // break and other cases 
    } 

2

Jak Status enum jest zamknięty w klasie Test trzeba użyć Test.Status zamiast z tylko Status.

1

Wyliczenia są (mniej więcej) po prostu klasami, tak jak wszystkie inne, więc zasady tutaj są takie same jak w przypadku innych klas wewnętrznych. Tutaj prawdopodobnie miałeś zadeklarować klasę enum jako static: nie zależy to od członków jej klasy otaczającej. W takim przypadku prawidłowym sposobem jest odniesienie się do niego. Jeśli naprawdę nie masz na myśli, że klasa jest statyczna, prawdopodobnie musisz użyć instancji jako kwalifikatora "przestrzeni nazw", tj. test.Status.Opened.

Edytuj: Podobno wyliczenia są pośrednio statyczne. To ma jakiś sens, biorąc pod uwagę to, co powinno być wyliczeniem, ale prawdopodobnie dobrze jest ogłosić je jako statyczne.

10

Jeśli getStatus() powraca w rzeczywistości Status sprawa powinna być:

case Opened: 

Jeśli spróbujesz:

case Test.Status.Opened: 

IDE daje błąd jak:

an enum switch case label must be the unqualified name of an enumeration constant 
0

Spróbuj tego przykładu:

switch(test.getStatus()) { 

    case FILE : 
      fullList.addAll(getFileMensionList(session, search, authUser)); 
      break; 
    case EVENT : 
      fullList.addAll(getEventMensionList(session, search, authUser)); 
      break; 
    case POLL : 
      fullList.addAll(getPollMensionList(session, search, authUser)); 
      break; 
    case PROJECT : 
      fullList.addAll(getProjectMensionList(session, search, authUser)); 
      break; 
    case TASK : 
      fullList.addAll(getTaskMensionList(session, search, authUser)); 
      break; 
} 
1

I oświadczył enum w mojej klasie, co następuje:

public class MyBinaryTree {

private Node root; 
public enum ORDER_TYPE { 
    IN_ORDER, POST_ORDER, 
}; 

    public void printTree(ORDER_TYPE order) { 
    //Printing tree here 
    } 

}

i starałem się uzyskać dostęp do tego w innej klasie

public class Solution1 {

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    MyBinaryTree myTree = new MyBinaryTree(); 
      myTree.printTree(myTree.ORDER_TYPE.POST_ORDER); 
    } 

}

Problemem tutaj jest, jeśli mogę użyć obiektu instancji w celu uzyskania dostępu do ORDER_TYPE enum pojawia się błąd czasu kompilacji: „ORDER_TYPE nie może zostać rozwiązany lub nie jest polem

Sprawdziłem ponownie i zmienił mojego kodu bezpośrednio użyć nazwy klasy jako nazwa kwalifikatora

public static void main(String[] args) { 
MyBinaryTree myTree = new MyBinaryTree(); 
myTree.printTree(MyBinaryTree.ORDER_TYPE.POST_ORDER); 
} 

To rozwiązało problem - wierzę, że gdy używamy enum jednej klasy w inny - powinniśmy do niego dostęp za pośrednictwem kla jest jak statyczna metoda.

Powiązane problemy