2011-12-12 75 views
28

如果我有像這樣的Java類:使用來自不同類的Java枚舉?

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

,我曾在不同的類文件不同的類(但在同一個項目/文件夾):

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

我將有效在另一個類中使用一個類的枚舉(在我的情況下,特別是在switch-case語句中)。

然而,當我這樣做,我得到這樣一個錯誤:

無法找到符號 - 類狀態

我將如何解決呢?

+2

所有的答案似乎是正確的,但是當我這樣做,它開始給錯誤'枚舉開關case標籤必須是枚舉constant'的不合格的名字,我發現只需在狀態前去除一切( 'Status.Opened'成爲'Opened')它修復了它。 – Bhaxy

回答

77

枚舉開關case標籤必須是枚舉常量的不合格名稱:

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

沒關係它是在另一個類中定義的。在任何情況下,編譯器都可以根據您的switch語句推斷枚舉的類型,並且不需要常量名稱即可限定。無論出於何種原因,使用限定名稱是無效的語法。

此要求由JLS §14.11規定:

SwitchLabel: 
    case ConstantExpression : 
    case EnumConstantName : 
    default : 

EnumConstantName: 
    Identifier 

(感謝馬克·彼得斯related post爲參考)。

+4

投票了 - 我今天學到新的東西... –

+1

@AmirAfghani - 我幾乎去了同樣的路線,如果你看一下我的編輯歷史:)幸運的是,我測試了它,並想起了枚舉。 –

+1

盡職調查*確實*付清;) –

2

NVM

它需要完全不合格,資格由switch()編變量的類型(在這種情況下test.getStatus(),這是一個Test.Status)給出。


Enum Status是你 class Test的一部分。因此,你需要限定它:

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

由於Status枚舉被封閉在Test類,你需要使用Test.Status代替只是Status

1

枚舉(或多或少)就像任何其他類一樣,所以這裏的規則與其他內部類相同。在這裏,您可能打算將枚舉類聲明爲static:它不依賴於它的封閉類的成員。在這種情況下,Test.Status.Opened將是引用它的正確方法。如果你真的不是說這個類是靜態的,那麼你可能需要使用一個實例作爲「名稱空間」限定符,即test.Status.Opened

編輯:顯然枚舉是隱式靜態的。這在給定枚舉應該是什麼時候有一定意義,但是將它們明確地聲明爲靜態可能是一種好的形式。

10

如果您getStatus()其實回報Status你的情況應該是:

case Opened: 

如果你嘗試:

case Test.Status.Opened: 

你的IDE會給你像一個錯誤:

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

與此例嘗試

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

我宣佈我班上一個枚舉如下:

公共類MyBinaryTree {

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

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

}

,我試圖訪問此不同類

公共類解決方法1 {

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

}

這裏的問題是,如果我用一個實例對象來訪問枚舉ORDER_TYPE我得到一個編譯時錯誤:「ORDER_TYPE不能得到解決或無法在現場

我檢查再次,改變了我的代碼直接使用類名作爲名稱限定符

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

這解決了問題 - 我相信,只要我們使用一個類的枚舉在另一 - 我們應該通過CLAS訪問像一個靜態方法。