【问题标题】:How can I reference my Java Enum without specifying its type如何在不指定其类型的情况下引用我的 Java 枚举
【发布时间】:2010-12-13 05:14:57
【问题描述】:

我有一个像这样定义自己的枚举的类:

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  // << Gives "E1 cannot be resolved" in eclipse.
    }
    public Test2(MyEnum e) {}
}

如果我指定 MyEnum.E1 它可以正常工作,但我真的只是想将它作为“E1”。知道如何实现这一点,还是必须在另一个文件中定义它才能工作?

结论: 我无法正确获取导入的语法。由于有几个答案表明这是可能的,我将选择一个给我所需语法的答案,并为其他答案投票。

顺便说一句,其中一个非常奇怪的部分(在我让静态导入工作之前),我编写的使用枚举的 switch 语句不允许枚举以其类型为前缀——所有其余代码需要它。伤了我的头。

【问题讨论】:

  • 关于 switch 语句中的“非常奇怪”的行为:Java 在 switch 语句中的所有枚举上执行此操作。由于您知道要打开什么类型,他们认为没有理由让您在每个 case 块中再次指定类型。 download.oracle.com/javase/tutorial/java/javaOO/enum.html
  • 我猜对我来说是它不允许 Enum 类型前缀。其他任何地方的前缀都是必需的(如果未导入)或可选的。
  • 我同意你关于 switch 不一致的观点,这让经验不足的 Java 程序员摸不着头脑。

标签: java enums


【解决方案1】:

其实你可以做一个嵌套枚举的static import。下面的代码编译得很好:

package mypackage;

import static mypackage.Test.MyEnum.*;

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  
    }

    public static void Test2(MyEnum e) {}
}

【讨论】:

  • 我在我的问题中提到了这个作为解决方案,但我真的不想这样做。枚举仅在这个文件中使用。这似乎很奇怪,这不仅会自动起作用。
  • 虽然必须使用静态导入,但不需要在自己的类中定义。
  • @Bill K,为什么你认为它应该自动工作?你会如何期望这会起作用呢?类 A { 枚举 B {X,Y};枚举 C {X,Z}; }
  • 此解决方案之所以有效,是因为 MyEnum 在 Test 之外是可见的。如果 MyEnum 是私有的,则解决方案将不起作用。
  • 不要忘记最后一部分,“import static mypackage.Test.MyEnum.*;”中的符号“.*”和我一样!
【解决方案2】:

您可以对嵌套类进行静态导入:

import static apackage.Test.Enum.*;

【讨论】:

    【解决方案3】:

    必须在包中定义 Test 类才能导入。

    使用Test 中定义的包(IT WORKS):

    package mypackage;
    

    你可以使用:

    import static mypackage.Test.MyEnum.*;
    

    没有定义包,你不能使用(DOES NOT WORK):

    import static Test.MyEnum.*;
    

    【讨论】:

    • 好点>> Without package defined, you cannot use (DOES NOT WORK):
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2017-06-15
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多