我可以創建一個空的Java枚舉類型,但是當我想添加一些方法:我得到一個「語法錯誤」(進入Eclipse)。 我沒有找到有關這方面的官方文檔,所以我的問題是:它是不可能的(所以清楚地提到它在哪裏?)還是隻是編譯器是錯誤的?是否可以使用方法創建一個空的Java枚舉類型?
回答
是的,這是可能的。你只需要添加一個;
終止枚舉常量的(空)名單:
enum TestEnum {
; // doesn't compile without this.
public void hello() {
System.out.println("Hello World");
}
}
JLS Syntax Definition for enum
s
(注意,沒有任何情況下,你只能夠調用的的static
方法枚舉)
相關:
hello方法將不可能調用,不是嗎?我沒有看到這樣的結構的重點。 –
因爲它的立場是。也許他的方法是「靜態」,我不知道。但是,我同意你的看法。這似乎有點尷尬。 – aioobe
感謝@aioobe的答案和鏈接。我想這樣做是因爲我認爲這是一種自然的,非常容易/可以理解的方式來實現一個非實例類(通常是一個只有靜態方法的實用類):對我來說,更自然地說「一個非實例類是一個沒有元素的枚舉「(即允許不使用任何實例),而不是說」應該使用拋出AssertionError的私有構造函數來實現「(參見Effective Java#4)。但這只是我的觀點,所以如果我錯了,不要猶豫,挑戰我... – cedric
是的,這就是:
您需要添加一個分號(;
)終止枚舉的空單。
這將編譯:
public enum MyEnum {
;
public void method() {
}
}
雖然我不認爲它會是很有用的。
方法可能是有用的,當枚舉說由字段組成..所以說你有一個枚舉COLORS有一個int表示,短的字符串表示形式以及顯示字符串表示形式..那麼這個枚舉可以有像getInteger()這樣的方法, getShortString(),getDisplayString()..例如,它使用getDisplayString()選項在GUI上顯示...可能使用getShortString()選項存儲在數據庫中... – Scorpion
我認爲波希米亞的含義是,他無法想象使用方法的* empty *枚舉有用。 – aioobe
是的 - 任何這樣的實例方法將無法訪問。而且,對於一個空的枚舉,我想不出有什麼用處。 – Bohemian
Absoulely,
/**
* @author The Elite Gentleman
* @since 06 September 2011
*
*/
public enum ExampleEnum {
WHAT_ENUM
;
public void doOperation() {
}
}
後來:
ExampleEnum exEnum = ExampleEnum.WHAT_ENUM;
exEnum.doOperation();
當然可以! 「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哈哈哈哈哈哈。
如果你真的需要一個枚舉,並且你希望它有實例方法,並且你已經決定召喚長老神的反射來迫使這個世界憎惡,那麼它是有用。
這肯定會讓以後的其他開發者感到困惑。
- 1. 是否可以創建泛型枚舉?
- 2. 是否有可能創建一個泛型按位枚舉'IsOptionSet()'方法?
- 3. 是否可以創建一個未定義類型的方法?
- 4. 在枚舉中枚舉是否有一個通用的方法?
- 5. 是否可以在Delphi中創建一個類型方法?
- 6. 是否可以確定某個類型是否是範圍枚舉類型?
- 7. 是否可以根據輸入文件創建Java枚舉?
- 8. Java枚舉繼承:是否有可能以某種方式將枚舉的toString()方法提取到一個通用的超類/枚舉?
- 9. 檢查類型是枚舉的方法
- 10. 是否可以用另一個類覆蓋枚舉?
- 11. 有什麼辦法可以檢查一個類型是枚舉類型嗎?
- 12. 是否可以創建一個可用於創建任何類的「新」實例的泛型方法或類?
- 13. Java標準庫中是否有一些方法可以從一組枚舉中獲得最小的枚舉?
- 14. 創建一個枚舉或使用.class在java中的類型之間切換?
- 15. 可空枚舉空類型問題
- 16. C++枚舉類可以有方法嗎?
- 17. Java的方式基於枚舉類型來創建一個對象
- 18. 是否有可能在C++中創建一個int +枚舉?
- 19. 如何創建一個枚舉方法(java)
- 20. 使用另一個枚舉中的特定值創建枚舉
- 21. 是否可以使用Java枚舉的Clojure案例表單?
- 22. 是否可以編寫一個創建方法的方法?
- 23. Java枚舉可以添加一個返回方法嗎?
- 24. 創建一個通用類型的EnumMap枚舉
- 25. 創建一個通用類型的枚舉集合
- 26. 是否可以在Typescript中定義一個沒有顯式類型的枚舉?
- 27. 是否可以在一個枚舉中分配不同類型的值
- 28. 我們可以在java中使用C++類型枚舉嗎?
- 29. 如何創建一個映射到一個枚舉類型?
- 30. 是否可以在Java枚舉中使用上範圍對象?
如果您發佈了出現錯誤的代碼,我們將能夠給出更詳細的答案。 – tb189
爲什麼你想要一個空的枚舉? – maasg
他可能想在運行時創建一組Enum,但仍有實例行爲。 – ggb667