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

时间:2011-12-12 22:12:20

标签: java class enums

如果我有一个像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语句中)。

然而,当我这样做时,我收到如下错误:

  

找不到符号 - 类状态

我该如何解决?

7 个答案:

答案 0 :(得分:78)

枚举开关案例标签必须是枚举常量的非限定名称:

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

(感谢Mark Peters'related post作为参考。)

答案 1 :(得分:10)

如果您的getStatus()实际上返回Status,则您的案例应为:

case Opened:

如果您尝试:

case Test.Status.Opened:

您的IDE会出现如下错误:

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

答案 2 :(得分:2)

NVM

它必须完全不合格,资格由switch() ed变量的类型给出(在本例中为test.getStatus(),即Test.Status)。


<击> 您的Enum Statusclass 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
    }

<击>

答案 3 :(得分:2)

由于Status课程中包含Test枚举,您需要使用Test.Status而非Status

答案 4 :(得分:1)

枚举(或多或少)只是与其他类似的类,因此这里的规则与其他内部类相同。在这里,您可能想要将枚举类声明为static:它不依赖于其封闭类的成员。在这种情况下,Test.Status.Opened将是引用它的正确方法。如果你真的不认为该类是静态的,你可能需要使用一个实例作为“命名空间”限定符,即test.Status.Opened

编辑:显然,枚举是隐式静态的。考虑到枚举应该是什么,这是有道理的,但将它们明确地声明为静态可能是好的形式。

答案 5 :(得分:1)

我在课堂上宣布了一个枚举如下:

公共类MyBinaryTree {

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

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

}

我试图在另一个类中访问它

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

}

这里的问题是如果我使用实例对象来访问枚举ORDER_TYPE我得到编译时错误:&#34; ORDER_TYPE无法解析或不是字段&#34; < / p>

我再次检查并更改了我的代码,直接使用类名作为名称限定符

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

这解决了这个问题 - 我相信每当我们在另一个类中使用一个类的枚举时 - 我们应该通过类来访问它,就像静态方法一样。

答案 6 :(得分:0)

试试这个例子

  func textFieldShouldReturn(textField: UITextField!) -> Bool  
    {
        messageTextField.resignFirstResponder()
        return true;
    }