我可以创建一个空的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. 你可以通过一个枚举类的方法(Java)
- 4. 在枚举中枚举是否有一个通用的方法?
- 5. 是否可以在Delphi中创建一个类型方法?
- 6. 是否可以根据输入文件创建Java枚举?
- 7. 检查类型是枚举的方法
- 8. 是否可以用另一个类覆盖枚举?
- 9. 有什么办法可以检查一个类型是枚举类型吗?
- 10. 是否可以创建一个可用于创建任何类的“新”实例的泛型方法或类?
- 11. 创建一个枚举或使用.class在java中的类型之间切换?
- 12. Java标准库中是否有一些方法可以从一组枚举中获得最小的枚举?
- 13. 可空枚举空类型问题
- 14. 如何创建一个枚举方法(java)
- 15. 是否有可能在C++中创建一个int +枚举?
- 16. Java枚举可以添加一个返回方法吗?
- 17. 是否可以编写一个创建方法的方法?
- 18. 创建一个通用类型的EnumMap枚举
- 19. 是否可以在一个枚举中分配不同类型的值
- 20. 是否可以在Typescript中定义一个没有显式类型的枚举?
- 21. 如何枚举一个类的方法
- 22. 是否可以在Java枚举中使用上范围对象?
- 23. Java类枚举枚举类
- 24. Java枚举方法
- 25. 基于枚举创建枚举类别
- 26. 列表类型是否可以在枚举时更改?
- 27. 将一个类型的枚举赋值为另一个类型的枚举?
- 28. 如何通过反射区分值类型,可为null的值类型,枚举,可空 - 枚举,引用类型?
- 29. Java枚举:两个枚举类型,每个枚举类型包含彼此的引用?
- 30. 使用类型别名到Java枚举
如果您发布了出现错误的代码,我们将能够给出更详细的答案。 – tb189
为什么你想要一个空的枚举? – maasg
他可能想在运行时创建一组Enum,但仍有实例行为。 – ggb667