[英]Declare java enum with a String array
我正在尝试根据我从数据库中检索的数据声明枚举类型。 我有一个方法,返回表格中我想要进行枚举类型的所有行的字符串数组。 有没有办法用数组构造枚举?
这是我尝试过的,但从它在eclipse中看起来的方式来看,似乎这只是通过该名称创建了一个方法:
public enum ConditionCodes{
Condition.getDescriptions();
}
先感谢您!
你不能。
enum
的值必须在编译时知道。 如果你还有别的东西,那就不是enum
。
您可以通过类似于Java语言通过enum
关键字引入对此技术的支持之前使用的旧类型安全枚举的实现来接近。 您可以使用这些技术,但只需将static final
字段替换为从DB读取的值。
为了使你的枚举有用,必须在编译时将其固定。 从数据库查询生成枚举意味着您希望在运行时看到新的枚举值。 即使您使用数据库查询创建了代码生成器来动态创建枚举类,您也无法在代码中引用这些枚举值,这就是拥有它们的重点。
很难看出任何编译器如何支持它。
枚举的全部意义应该是您可以通过编译时检查值的有效性。 例如,如果您声明枚举“enum MyStatusCode {FOO,BAR,PLUGH}”,那么在您的代码中,如果您编写“MyStatusCode.FOO”,一切都很好,但如果您编写“MyStatusCode.ZORK”,您将获得编译 - 时间错误。 这可以保护您免受错误拼写错误或对一个枚举值与另一个枚举值的混淆。 (我最近遇到了一个问题,即程序员意外地将交付方式分配给交易类型,因此当他打算将房屋交付更改为客户提货时,将销售神奇地改为库存调整。)
但是如果你的值是在运行时动态定义的,那么编译器怎么做呢? 如果您在上面的示例中编写了MyStatusCode.ZORK,则编译器无法知道此值是否将在运行时存在于数据库中。 即使你想象一个足够聪明的编译器来弄清楚枚举是如何被填充的,并且检查数据库以查看该值是否存在于适当的表中,它也无法知道当你实际运行时它是否存在。
简而言之,你想要的是与枚举有很大不同的东西。
不,这是不可能的,因为枚举类型必须在编译时定义,而您正在寻找的是动态创建它。
如果使用一个班级,也许你会更好。
如果你想变得非常疯狂,我认为注释处理可以做到这一点。 注释处理允许您挂钩编译器,并在存在@annotation
时神奇地修改内容。
当然,枚举中的值将是编译时可用的任何值。
我想在这里你需要一个List或Set以及一些用于搜索和比较的实用方法。
所以这是你的清单
List<String> conditionCodes = new ArrayList<String>();
//Somehow get Rows or POJO Beans from database with your favorite framework
Collection<Row> dbRows = getConditionCodes();
for(Row curRow : dbRows)
conditionCodes.add(curRow.getName());
并搜索
public boolean conditionExists(String name) {
return conditonCodes.contains(name);
}
public String getCondition(String name) {
return conditionCodes.get(name);
}
(当然你可能想要使用List自己的方法而不是自己的方法)
超过你不能,你不想。 每个枚举,甚至是Java相当酷的枚举,都是面向代码的。
它与集合完全相同,但是当你遇到它时,你会倾向于编写重复的代码 - 使用集合你更有可能编写一个循环。
我建议你创建一个带有私有构造函数的类,让它创建自己的实例,然后提供一个getInstance(String)来检索实例。 这就像旧的类型安全枚举模式。
但是,从长远来看,如果你能够在这个类中获得足够的智能,而不是在特定的实例上进行区分,那就更好了 - 从“Enum”的方式来看:
if(myEnum.stringValue.equals("EnumTarget"))
executeCode();
以OO的方式做到这一点:
myEnumLikeObject.executeCode();
将您希望的代码移动到“枚举”中 - 最好直接委托给实例化的包含对象,并在创建时设置为“枚举”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.