使用来自不同类的Java枚举?

问题描述:

如果我有像这样的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

枚举开关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

尽职调查*确实*付清;) –

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 
    } 

由于Status枚举被封闭在Test类,你需要使用Test.Status代替只是Status

枚举(或多或少)就像任何其他类一样,所以这里的规则与其他内部类相同。在这里,您可能打算将枚举类声明为static:它不依赖于它的封闭类的成员。在这种情况下,Test.Status.Opened将是引用它的正确方法。如果你真的不是说这个类是静态的,那么你可能需要使用一个实例作为“名称空间”限定符,即test.Status.Opened

编辑:显然枚举是隐式静态的。这在给定枚举应该是什么时候有一定意义,但是将它们明确地声明为静态可能是一种好的形式。

如果您getStatus()其实回报Status你的情况应该是:

case Opened: 

如果你尝试:

case Test.Status.Opened: 

你的IDE会给你像一个错误:

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

与此例尝试

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

我宣布我班上一个枚举如下:

公共类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访问像一个静态方法。