使用来自不同类的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语句中)。
然而,当我这样做,我得到这样一个错误:
无法找到符号 - 类状态
我将如何解决呢?
枚举开关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为参考)。
投票了 - 我今天学到新的东西... –
@AmirAfghani - 我几乎去了同样的路线,如果你看一下我的编辑历史:)幸运的是,我测试了它,并想起了枚举。 –
尽职调查*确实*付清;) –
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访问像一个静态方法。
所有的答案似乎是正确的,但是当我这样做,它开始给错误'枚举开关case标签必须是枚举constant'的不合格的名字,我发现只需在状态前去除一切( 'Status.Opened'成为'Opened')它修复了它。 – Bhaxy