2011-09-06 138 views
9

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

+0

如果您发布了出现错误的代码,我们将能够给出更详细的答案。 – tb189

+3

为什么你想要一个空的枚举? – maasg

+0

他可能想在运行时创建一组Enum,但仍有实例行为。 – ggb667

回答

16

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

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

JLS Syntax Definition for enums

(注意,没有任何情况下,你只能够调用的的static方法枚举)

相关:

+0

hello方法将不可能调用,不是吗?我没有看到这样的结构的重点。 –

+0

因为它的立场是。也许他的方法是“静态”,我不知道。但是,我同意你的看法。这似乎有点尴尬。 – aioobe

+3

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

5

是的,这就是:

您需要添加一个分号(;)终止枚举的空单。
这将编译:

public enum MyEnum { 
    ; 
    public void method() { 

    } 
} 

虽然我不认为它会是很有用的。

+1

方法可能是有用的,当枚举说由字段组成..所以说你有一个枚举COLORS有一个int表示,短的字符串表示形式以及显示字符串表示形式..那么这个枚举可以有像getInteger()这样的方法, getShortString(),getDisplayString()..例如,它使用getDisplayString()选项在GUI上显示...可能使用getShortString()选项存储在数据库中... – Scorpion

+2

我认为波希米亚的含义是,他无法想象使用方法的* empty *枚举有用。 – aioobe

+1

是的 - 任何这样的实例方法将无法访问。而且,对于一个空的枚举,我想不出有什么用处。 – Bohemian

1

Absoulely,

/** 
* @author The Elite Gentleman 
* @since 06 September 2011 
* 
*/ 
public enum ExampleEnum { 
    WHAT_ENUM 
    ; 

    public void doOperation() { 

    } 
} 

后来:

ExampleEnum exEnum = ExampleEnum.WHAT_ENUM; 
exEnum.doOperation(); 
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(); 
} 
} 

MWU哈哈哈哈哈哈。

如果你真的需要一个枚举,并且你希望它有实例方法,并且你已经决定召唤长老神的反射来迫使这个世界憎恶,那么它是有用

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

相关问题