是否可以使用方法创建一个空的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();