Java 枚举与具有公共静态最终字段的类相比有什么优势?

2022-08-31 06:44:32

我对C#非常熟悉,但开始在Java中工作得更多。我希望知道Java中的枚举基本上等同于C#中的枚举,但显然事实并非如此。最初,我很高兴得知Java枚举可以包含多个数据片段,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。但是,从那时起,我发现了许多在C#中微不足道的功能,例如能够轻松地为枚举元素分配一个特定值,因此无需花费大量精力即可将整数转换为枚举(即将整数值转换为匹配的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);

据我所知,卡萨布兰卡的答案是唯一满足这一点的答案。


答案 1
  1. 类型安全和价值安全。
  2. 保证单例。
  3. 能够定义和重写方法。
  4. 能够在语句语句中使用值而不加限定。switchcase
  5. 内置值顺序化,通过ordinal().
  6. 按名称而不是按值进行序列化,这提供了一定程度的未来适应性。
  7. EnumSet和类。EnumMap

答案 2

从技术上讲,人们确实可以将枚举视为具有一堆类型常量的类,这实际上是枚举常量在内部实现的方式。但是,使用a可以为您提供有用的方法(Enum javadoc),否则您必须自己实现这些方法,例如.enumEnum.valueOf