是否可以使用方法创建一个空的Java枚举类型?

我可以创建一个空的Java枚举类型,但是当我想添加一些方法时:我得到一个“语法错误”(进入Eclipse)。 我没有找到关于此的官方文档,所以我的问题是:它是不可能的(所以它在哪里明确提到?)或者只是编译器错了?

是的,这是可能的。 你只需要添加一个; 终止枚举常量的(空)列表:

 enum TestEnum { ; // doesn't compile without this. public void hello() { System.out.println("Hello World"); } } 

enum的JLS语法定义

(注意,没有任何实例,您只能调用Enum的static方法。)

有关:

  • 零实例枚举vs私有构造函数用于防止实例化

当然可以! “Ia!Ia!Cthulhu Fthagn!Ph’nglui mglw’nfah Cthulhu R’lyeh wgah’nagl fhtagn !!”

最初的想法:“ http://www.theserverside.com/news/thread.tss?thread_id=50190

以自己的风险摧毁现实。

 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; enum ThingsThatShouldNotBe { ; public void HelloWorld() { System.out.println(this.name() + " Says Hello!"); } public static void main(String[] args) throws Exception { Constructor con = ThingsThatShouldNotBe.class.getDeclaredConstructors()[0]; Method[] methods = con.getClass().getDeclaredMethods(); for (Method m : methods) { if (m.getName().equals("acquireConstructorAccessor")) { m.setAccessible(true); m.invoke(con, new Object[0]); } } Field[] fields = con.getClass().getDeclaredFields(); Object ca = null; for (Field f : fields) { if (f.getName().equals("constructorAccessor")) { f.setAccessible(true); ca = f.get(con); } } Method m = ca.getClass().getMethod("newInstance", new Class[] { Object[].class }); m.setAccessible(true); ThingsThatShouldNotBe v = (ThingsThatShouldNotBe) m.invoke(ca, new Object[] { new Object[] { "Cthulhu", Integer.MAX_VALUE } }); System.out.println(v.getClass() + ":" + v.name() + ":" + v.ordinal()); System.out.println("Say hello Cthulhu!"); v.HelloWorld(); } } 

穆哈哈哈哈哈哈。

如果你真的需要一个Enum并且你想让它拥有实例方法,并且你已经决定召唤年长的反思之神来强迫这种可憎的世界,那么它就是有用的

这肯定会让以后的其他开发人员感到困惑。

是的:

您需要添加分号( ; )来终止空的枚举列表。
这编译:

 public enum MyEnum { ; public void method() { } } 

虽然我想不出它会有什么用处。

Absoulely,

 /** * @author The Elite Gentleman * @since 06 September 2011 * */ public enum ExampleEnum { WHAT_ENUM ; public void doOperation() { } } 

后来:

 ExampleEnum exEnum = ExampleEnum.WHAT_ENUM; exEnum.doOperation();