我对C#非常熟悉,但开始在Java中工作更多.我希望得知Java中的枚举基本上与C#中的枚举相同,但显然情况并非如此.最初,我很高兴得知Java枚举可能包含多个数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).但是,从那时起我发现C#中缺少许多功能,例如能够轻松地为枚举元素分配特定值,以及因此无需花费大量精力就能将整数转换为枚举(即整数值转换为相匹配的Java枚举).
所以我的问题是:对于带有一堆公共静态最终字段的类,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 = …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个库,它具有一组预定义的枚举值.比方说,我的枚举如下所示.
public enum EnumClass {
FIRST("first"),
SECOND("second"),
THIRD("third");
private String httpMethodType;
}
Run Code Online (Sandbox Code Playgroud)
现在,使用此库的客户端可能需要添加更多值.比方说,客户端需要添加CUSTOM_FIRST
和CUSTOM_SECOND
.这不会覆盖任何现有值,但会使枚举具有5个值.
在此之后,我应该可以使用类似的东西<? extends EnumClass>
,有5种不变的可能性.
实现这一目标的最佳方法是什么?
在什么情况下枚举更适合比例如保证独特元素的集合(java.util.Set的实现者,我猜......)?
(这是我之前的问题的后续跟进)
我有一个枚举,我想在运行时从web.config获取.我开始阅读有关构建提供程序的内容,但这似乎适用于类.有人能指出我的一个例子,或者至少指出我正确的方向.
现在我在web.config中有一个逗号分隔的值列表,这不是类型安全的,容易出错.
如果有另一种方法可以获得这种"动态枚举",我会对其他想法持开放态度.
谢谢!
假设你有一个包含3个值的枚举:
enum Colors { RED, GREEN, BLUE }
Run Code Online (Sandbox Code Playgroud)
你在某种方法中切换它的所有值,认为你已经处理了所有情况:
switch (colors) {
case RED: ...
case GREEN: ...
case BLUE: ...
}
Run Code Online (Sandbox Code Playgroud)
然后,您在枚举中添加一个新值:
enum Colors { RED, GREEN, BLUE, YELLOW }
Run Code Online (Sandbox Code Playgroud)
除了你在方法中默默地错过一个案例之外,一切仍然编译得很好YELLOW
.有没有办法在这种情况下引发编译时错误?
编辑:不明白为什么这被标记为欺骗我可以在Java中添加和删除运行时枚举的元素.由于答案是"否",这意味着应该可以在编译时知道枚举的所有值,因此我要求编译器/某些代码分析工具可以实现, ?
有什么方法可以向Java中的内置枚举类添加元素?
我的问题类似于Java能否在运行时添加和删除枚举元素,但该问题似乎旨在构建自己的枚举,然后对其进行修改。我假设存在无法更改的现有枚举,例如
enum Days{ MONDAY, TUESDAY, WEDNESDAY }
Run Code Online (Sandbox Code Playgroud)
我想在此添加星期四,星期五等。因此,不幸的是,关于如何使用接口来实现我的目标的建议,或比枚举更有效的其他方法的建议,在这里不适用。
据我了解,枚举是隐式最终的,因此无法扩展它并向其中添加更多元素。它具有专用字段,但看来我可以使用反射来访问这些字段-即使我不能添加一个新的专用字段,也可以更改一个专用字段,例如,将星期一更改为星期四?
编辑:澄清情况
人们建议在将代码编译到程序中之前先对其进行更改。我的代码是我无法更改的更大项目的一部分;包含枚举的类由较大的程序加载,然后我的类才能访问它。到那时,我想将缺少的元素添加到枚举中。字节码操作仍然是要走的路吗?
你好,我不确定标题是否足够描述.我的意思是创建一个这样的枚举
public enum Test{
ONE, TWO ,THREE
}
Run Code Online (Sandbox Code Playgroud)
这看起来像硬编码.如果由于某种原因我需要添加四个某些业务规则的演变原因.我应该编码并再次部署它吗?是不是让它从文件,例如spring配置或属性文件中选择元素的方法?谢谢阅读.