【发布时间】:2012-04-15 17:10:27
【问题描述】:
我非常熟悉 C#,但开始更多地使用 Java。我希望知道 Java 中的枚举基本上等同于 C# 中的枚举,但显然情况并非如此。最初,我很高兴得知 Java 枚举可以包含多条数据,这似乎非常有利 (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。但是,从那时起,我发现 C# 中缺少许多微不足道的功能,例如轻松为枚举元素分配某个值的能力,以及因此无需大量努力即可将整数转换为枚举的能力(即Convert integer value to matching Java Enum)。
所以我的问题是:Java 枚举相对于具有一堆公共静态最终字段的类有什么好处吗?还是它只是提供更紧凑的语法?
编辑:让我更清楚。 Java 枚举与具有一堆相同类型的公共静态最终字段 的类相比有什么好处?例如,在第一个链接的行星示例中,枚举与具有这些公共常量的类相比有什么优势:
public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = new Planet(1.024e+26, 2.4746e7);
据我所知,卡萨布兰卡的答案是唯一能满足这一点的。
【问题讨论】:
-
@Bohemian:可能不是重复的,因为 OP 只提到了
public static final字段,这些字段可能是输入值,不一定是ints。 -
@Shahzeb 几乎没有。显然,使用枚举而不是字符串常量是一个非常好的主意,而且值得鼓励。类型安全,不需要静态实用程序函数等等。绝对没有理由使用字符串。
-
@Voo 是的,我知道会有分歧。这是 49 秒内的一个。枚举很棒(我喜欢它们并且经常使用它们)但是在声明常量或使用它时需要什么类型的安全性。每次需要为字符串文字声明一个常量时,创建枚举都是一种过度杀伤力。
-
@Shahzeb 如果您只有一个变量,请务必使用字符串,这里不会发生太多事情(单个值作为参数毫无意义)。但请注意,我们谈论的是常量
S,所以现在我们谈论的是可能将它们传递给函数等。我们需要类型安全吗?好吧,不,但是大多数人认为“一切都是void*”的c 风格类型很好,它可以阻止错误(特别是如果传递多个枚举/字符串参数!)。它还将常量放入自己的命名空间等。与此相反,仅使用普通变量并没有真正的优势。 -
@Bohemian:我不明白怎么做。对于
ints,没有类型安全,因为可以传递任何值。另一方面,类型化对象在类型安全方面与枚举没有什么不同。