2011-09-06 102 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哈哈哈哈哈哈。

如果你真的需要一個枚舉,並且你希望它有實例方法,並且你已經決定召喚長老神的反射來迫使這個世界憎惡,那麼它是有用

這肯定會讓以後的其他開發者感到困惑。

相關問題