2011-12-12 10 views
28

:Java enumlarını farklı sınıflardan mı kullanıyorsunuz? Böyle Java bir sınıf olsaydı

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

Ve ben farklı sınıf dosyasında farklı bir sınıf vardı (ama aynı proje/klasöründe):

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 
     } 
    } 
} 

ben etkili olur Başka bir sınıfta kullanılan bir sınıfta bir enum var (benim durumumda, özellikle bir anahtar durum bildirimi). Bunu yaparken

Ancak, ben almak gibi bir hata:

sembol bulamıyor - sınıf Durumu Bunu düzeltmek istiyorum nasıl

?

+2

Tüm cevaplar doğru görünüyordu, ancak bunu yaptığımda hata veren bir enum anahtarı durum etiketinin bir numaralandırma sabiti olmayan bir isim olması gerekiyordu ve ben durumun önündeki her şeyi kaldırmayı buldum. Status.Opened 'Opened' oldu, düzeltildi. – Bhaxy

cevap

77

Bir enum anahtar case etiketi bir enum sabiti niteliksiz adı olmalıdır Başka bir sınıf içinde tanımlanmış. Her durumda derleyici, switch ifadenize göre enum türünü çıkarır ve nitelendirilecek sabit adlara gerek duymaz. Herhangi bir nedenle, nitelikli adlar kullanmak geçersiz sözdizimi.

Bu gereklilik JLS §14.11 tarafından belirtilir:

SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

(Teşekkür Mark Peters' related post referans için.) Status enum Test sınıfında içine alınır gibi

+4

Oylama - Bugün yeni bir şey öğrendim ... –

+1

@AmirAfghani - Düzenleme geçmişime bakarsanız neredeyse aynı rotaya gittim :) Neyse ki test ettim ve enumları hatırladım. –

+1

Durum tespiti * yok * ödeme yap;) –

2

NVM Tamamen vasıfsız olması gerekmektedir

, nitelik (bir Test.Status bu durumda test.getStatus() bölgesi) switch() ed değişkeni göre verilmektedir. Sizin Enum Status


senin class Test bir parçasıdır. Bunun gibi, bunu hak gerekir:

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

farketmez:

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

yerine Test.Status kullanmak gerekir Sadece Status.

1

Enumlar (az ya da çok) diğer sınıflar gibidir, yani buradaki kurallar diğer iç sınıflarla aynıdır. Burada, enum sınıfını static olarak bildirmeniz gerekiyordu: bu, sınıfının üyelerine bağlı değildir. Bu durumda, Test.Status.Opened, başvurmak için doğru bir yol olacaktır. Sınıfın gerçekten statik olmasını istemiyorsanız, büyük olasılıkla "namespace" niteleyicisi, örneğin test.Status.Opened örneğini kullanmanız gerekir.

Düzenleme: Görünüşe göre, enumlar gizlidir. Bu, bir enumun olması gerektiği düşünüldüğünde bir anlam ifade ediyor, ama onları açık bir şekilde statik olarak ilan etmek iyi bir olasılık.Aslında sizin getStatus() döner bir Status davanız olması gerekiyorsa

10

:

case Opened: 

Eğer denerseniz:

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

case Test.Status.Opened: 

IDE sever bir hata verecektir

Bu örnekyle dene

şöyle
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

benim sınıfında Bir enum ilan etmişti:

public class MyBinaryTree {

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

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

}

ve ben farklı sınıfta bu erişmeye çalışıyordu

genel 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); 
    } 

}

Ben bir derleme zamanı hatası alıyorum enum ORDER_TYPE erişmek için bir örnek nesnesi kullanırsanız Buradaki sorun olduğunu

: "ORDER_TYPE çözülemeyen veya alan sağlamayabilir"

kontrol ettim biz clas aracılığıyla erişmek gerekir - Sanırım başka bir sınıfın enum kullanırken mutlaka inanıyoruz - yine doğrudan bu konuyu çözdü

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

adı eleme olarak sınıf adını kullanmak için kodumu değiştirdi Statik bir yöntem gibi.