当前位置: 首页 > 面试题库 >

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

马德厚
2023-03-14
问题内容

我对C#非常熟悉,但是开始在Java中工作更多。我希望了解到Java中的枚举基本上与C#中的枚举等效,但是显然并非如此。最初,我很高兴得知Java枚举可以包含多条数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。但是,从那时起,我发现了很多C#缺少的功能,例如能够轻松地将枚举元素分配给某个值的功能,以及因此无需花费大量精力即可将整数转换为枚举的功能(即转换整数值相匹配的Java枚举)。

所以我的问题是:与具有一堆公共静态final字段的类相比,Java枚举有什么好处吗?还是只是提供更紧凑的语法?

编辑:让我更清楚。与具有一堆相同类型的公共static final字段的类相比,Java枚举有什么好处?例如,在第一个链接的行星示例中,枚举相对于具有这些公共html" target="_blank">常量的类的优点是什么:

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);

据我所知,卡萨布兰卡的答案是唯一可以满足这一要求的答案。


问题答案:

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



 类似资料:
  • 问题内容: 和之间有什么区别? 例如 : 要么 问题答案: 尽管您 确实 希望遵守约定,但在功能上没有什么区别(字节码将 完全相同 ),请访问JLS-8.3.1。场修饰符: __ 这将是奇怪的,看.. 我也建议您访问checkstyle。 编辑: 从同一页面链接到该部分: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls

  • 问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其

  • 我遇到了以下javac编译失败,javac无法识别具有公共枚举的静态嵌套类上的注释。一旦我将枚举移出静态嵌套类,编译错误就得到了解决。有人知道javac失败的原因吗?这是java编译器错误吗?还是有我不知道的java细微差别? 下面是一个独立的测试用例。 未能编译: 编译输出: 编译: 无错误编译: 需要指出的事情: 1)注意编译失败的行号解析NestedClassNoEnum的注释没有问题。 2

  • 问题内容: 这样做的动机是我对StringBuilder最佳实践的一个较早问题的回答(“如意算盘”)。如果StringBuilder是可扩展的,则特定于域的子类可以扩展其流畅的接口,这将使StringBuilder传递给构建较大字符串部分的许多方法的代码更加严格。 我正在考虑为番石榴人士提供一些建议-也许是StringBuilder代表。 与仅使用final方法相比,StringBuilder用作