10

我有一个私有的枚举,不能暴露在课堂之外。无论如何我可以进行该类型的静态导入,这样我就不必每次都输入枚举类型?或者有没有更好的方法来写这个?例子:

package kip.test;

import static kip.test.Test.MyEnum.*; //compile error

public class Test
{
  private static enum MyEnum { DOG, CAT }

  public static void main (String [] args)
  {
    MyEnum dog = MyEnum.DOG; //this works but I don't want to type "MyEnum"
    MyEnum cat = CAT; //compile error, but this is what I want to do
  }
}
4

6 回答 6

10

您可以使用无修饰符访问级别,即

enum MyEnum { DOG, CAT }

MyEnum来自其他包的类和任何子类都不会看到。它是最接近的私有形式,但可以避免显式引用MyEnum.

于 2010-01-12T03:27:34.473 回答
5

考虑到您可以访问完全限定的字段,我会说这是编译器(或语言规范)中的一个错误,您无法静态导入它。

我建议您使枚举包受保护。

于 2010-01-12T03:21:56.467 回答
3

将一些代码移动到枚举的(静态)方法中可能(或可能不)是合理的。

如果按下,您可以复制外部类中的静态字段。

private static final MyEnum CAT = MyEnum.CAT;
private static final MyEnum DOG = MyEnum.DOG;

恶心,但有可能。

于 2010-01-12T03:28:13.310 回答
2

或者有没有更好的方法来写这个?

如果您的主要目标是引用没有其限定枚举标识符的项目,并私下维护此列表,您可以enum完全放弃该类型并使用普通的私有静态常量。

于 2010-01-12T03:32:19.447 回答
1

您可以简单地在枚举本身中编写代码。

public enum MyEnum {
DOG, CAT;
public static void main(String[] args) {
    MyEnum dog = MyEnum.DOG; // this works but I don't want to have to type
                                // MyEnum
    MyEnum cat = CAT; // compile error, but this is what I want to do
}
 }

另一个私有枚举可以在没有类的情况下被引用的地方是在 switch 语句中:

private static enum MyEnum {
    DOG, CAT
}

public static void main(String[] args) {
    MyEnum e = null;
    switch (e) {
    case DOG:
    case CAT:
    }
}
于 2010-01-12T03:26:22.423 回答
0

不,这几乎private就是全部内容。

于 2010-01-12T03:17:26.070 回答