Java 5中引入的Enum类的用途是什么?
我的建议是:
1)要么enum
只在编译之前存在(就像泛型一样;但我从来没有听说过任何关于它的事情,因为到处都写着编译后泛型被删除)
2)或枚举是以某种方式保持向后兼容性的一种方法(但我还没有看到这种方法)
还有其他建议吗?(顺便说一句,您是否在代码中使用过它?)
UPD:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html
换句话说,有一个enum
关键字和Enum
类。它们都出现在Java5中。问题是:为什么我们两者都需要
第二个问题:为什么Enum
成为API的一部分
# 1 楼答案
如果您在声明中讨论的是
enum
语法,而不是class
语法,那么这是正确的。在字节码级别,Java枚举是与任何其他类一样的类。枚举语义基本上由Java编译器实现# 2 楼答案
从the Java Tutorials:
枚举非常有用,是的,我在代码中已经多次使用它们
编辑:
。。。有一个枚举关键字和枚举类。它们都出现在Java5中。问题是:为什么我们两者都需要
这个问题类似于问“有一个
class
关键字和一个Object
类。为什么我们需要两者?”在这两种情况下,关键字基本上都是对编译器的提示;您可以将它们视为语法糖,它可以节省您的击键次数,并让编译器做更少的工作(通过不让编译器猜测您所声明的内容)
也见this q&a
。。。您是否在代码中使用过它
答案仍然是“是”特别是,
Enum#valueOf()
是一种用于解析字符串的静态方法:但这当然也行得通:
# 3 楼答案
添加了Enum,因此Enum提供的功能是可见的,并有文档记录。隐藏这个类会有什么好处
编译后不会删除泛型
不确定为什么需要枚举类来实现向后兼容性
我使用该类来读取枚举的作用,并在代码中检查枚举类型、valueOf等
讽刺的是,这个问题就在你的问题之前。它显示了使用该类的示例Checking if a class is java.lang.Enum
# 4 楼答案
依我拙见,enum最主要的好处是类型安全
假设您有一个函数,它可以通过具有固定可能性集的某个选项调用。说“销售”或“退货”。一个非常糟糕的解决方案是传入一个字符串,如:
这种方法的一个大问题是,如果有人试着用“销售”或“航行”来称呼它。除非程序验证只传入有效的参数,否则拼写错误可能会产生神秘的错误
好吧,许多程序员为此创建了常量:
这好多了,但还是有问题。假设我们有两个参数:
现在有人弄糊涂了,打电话给
doTransaction(FOREIGN, SALE)
。这将成功编译,通过程序内的任何有效性测试,并给出完全错误的结果。因为如果你没有抓住它,参数的顺序就错了枚举解决了这个问题。如果你改写
现在,如果有人试图写,
doTransaction(Locale.FOREIGN, SaleType.SALE)
,他们会得到一个编译时错误,并立即知道他们的参数是错误的# 5 楼答案
枚举的存在是为了表示类型安全的枚举(比使用
int
常量进行相同操作要好得多)如果您询问
Enum
类本身的用途是什么-它充当用户定义的enum
的超类。每个枚举被编译成一个类,该类使用适当的泛型参数(即自身)扩展Enum
为什么这是通过语法糖而不是简单的子类来实现的?首先,它强制执行枚举具有的特定语法(构成枚举成员的静态实例)。另一个原因可能是,子类
Enum<E extends Enum<E>>
所需的泛型操作对于以前从未见过任何泛型的开发人员来说将是非常困惑的。通过将这种复杂性隐藏在一个新的关键字后面,开发人员不必自己破译它。最后,关键字意味着它是一个特殊的构造,不应该像普通类一样对待它# 6 楼答案
这里有一些答案
http://www.myhomepageindia.com/index.php/2009/07/08/enums-in-java-5-code-examples.html