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

ced*_*ric 10 java enums

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

aio*_*obe 17

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

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

enums的JLS语法定义

(注意,没有任何实例,您只能调用staticEnum 的方法.)

有关:

  • 感谢@aioobe的答案和链接.我想这样做是因为我认为这是一种自然的,非常容易理解的方法来实现一个非可实现的类(通常是一个只有静态方法的实用类):对我来说,更自然地说"a非instanciable类是一个没有元素的枚举"(即允​​许不使用自身的实例),而不是说"它应该用私有构造函数抛出AssertionError来实现"(参见Effective Java#4).但这只是我的观点,所以如果我错了,请不要犹豫,挑战我...... (3认同)

ggb*_*667 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();
}
}
Run Code Online (Sandbox Code Playgroud)

穆哈哈哈哈哈哈.

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

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


Boh*_*ian 5

是的:

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

public enum MyEnum {
    ;
    public void method() {

    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为波希米亚人的意思是他不能想到任何有用的*empty*enum方法. (2认同)