【问题标题】:Using Java enums from different classes?使用来自不同类的 Java 枚举?
【发布时间】:2023-03-05 06:18:01
【问题描述】:

如果我有这样的 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 语句中)。

但是,当我这样做时,我会收到如下错误:

找不到符号 - 类状态

我该如何解决?

【问题讨论】:

  • 所有答案似乎都是正确的,但是当我这样做时,它开始给出错误an enum switch case label must be the unqualified name of an enumeration constant,我发现只需删除状态前面的所有内容(Status.Opened 变成Opened)它修复了它。

标签: java class enums


【解决方案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);
}

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

【讨论】:

    【解决方案2】:

    试试这个例子

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

    【讨论】:

      【解决方案3】:

      枚举 switch 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
      

      (感谢 Mark Peters 的 related post 提供参考。)

      【讨论】:

      • @AmirAfghani - 如果您查看我的编辑历史记录,我几乎走了同样的路 :) 幸运的是,我测试了它并记住了枚举。
      • 尽职调查是否有回报;)
      【解决方案4】:

      NVM

      它需要完全没有限定,限定由switch()ed 变量的类型给出(在本例中为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
          }
      

      【讨论】:

        【解决方案5】:

        如果您的getStatus() 实际上返回Status,您的情况应该是:

        case Opened:
        

        如果你尝试:

        case Test.Status.Opened:
        

        你的 IDE 会给你一个类似的错误:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            由于Status 枚举包含在Test 类中,您需要使用Test.Status 而不仅仅是Status

            【讨论】:

              猜你喜欢
              • 2021-12-06
              • 2012-07-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-27
              • 2019-12-29
              • 2012-11-05
              • 2017-12-29
              相关资源
              最近更新 更多