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

时间:2011-09-06 09:51:54

标签: java enums

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

4 个答案:

答案 0 :(得分:16)

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

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

JLS Syntax Definition for enums

(请注意,没有任何实例,您只能调用枚举的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();