我可以创建一个空的Java枚举类型,但是当我想添加一些方法时:我得到一个“语法错误”(进入Eclipse)。 我没有找到关于此的官方文档,所以我的问题是:它是不可能的(所以它在哪里明确提到?)还是只是编译器错了?
答案 0 :(得分:16)
是的,这是可能的。您只需要添加;
来终止枚举常量的(空)列表:
enum TestEnum {
; // doesn't compile without this.
public void hello() {
System.out.println("Hello World");
}
}
JLS Syntax Definition for enum
s
(请注意,没有任何实例,您只能调用枚举的static
方法。)
相关:强>
答案 1 :(得分:6)
当然可以! “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并且你想让它拥有实例方法,并且你已经决定召唤长老的反思之神来强迫这个可憎的世界,那么它就是有用的。 / p>
这肯定会让以后的其他开发人员感到困惑。
答案 2 :(得分:5)
是的,它是:
你需要添加一个分号(;
)来终止空的枚举列表
这编译:
public enum MyEnum {
;
public void method() {
}
}
虽然我无法想象它会有什么用处。
答案 3 :(得分:1)
绝对,
/**
* @author The Elite Gentleman
* @since 06 September 2011
*
*/
public enum ExampleEnum {
WHAT_ENUM
;
public void doOperation() {
}
}
字母:
ExampleEnum exEnum = ExampleEnum.WHAT_ENUM;
exEnum.doOperation();