我正在尝试根据我从数据库中检索的数据声明枚举类型。我有一个方法,返回表格中我想要进行枚举类型的所有行的字符串数组。有没有办法用数组构造枚举?
这就是我尝试过的,但从它在eclipse中看起来的方式来看,似乎只是通过这个名称创建了一个方法:
public enum ConditionCodes{
Condition.getDescriptions();
}
提前谢谢!
答案 0 :(得分:12)
你不能。
enum
的值必须在编译时知道。如果您还有其他任何内容,那么它不是enum
。
通过类似于the old typesafe enums的实现,您可以通过enum
关键字在Java语言引入对此技术的支持之前使用。您可以使用这些技术,但只需将static final
字段替换为从DB中读取的值。
答案 1 :(得分:3)
为了使你的枚举有用,必须在编译时确定它。从数据库查询生成枚举意味着您希望在运行时看到新的枚举值。即使您使用数据库查询动态创建了一个代码生成器来创建枚举类,您也无法在代码中引用这些枚举值,这就是拥有它们的重点。
答案 2 :(得分:1)
很难看出任何编译器如何支持它。
枚举的全部意义应该是您可以通过编译时检查值的有效性。例如,如果您声明枚举“enum MyStatusCode {FOO,BAR,PLUGH}”,那么在您的代码中,如果您编写“MyStatusCode.FOO”,一切都很好,但如果您编写“MyStatusCode.ZORK”,您将获得编译 - 时间错误。这可以保护您免受错误拼写错误或对一个枚举值与另一个枚举值的混淆。 (我最近遇到了一个问题,即程序员意外地将交付方式分配给交易类型,因此当他打算将房屋交付更改为客户提货时,将销售奇迹般地改为库存调整。)
但是如果你的值是在运行时动态定义的,那么编译器怎么做呢?如果您在上面的示例中编写了MyStatusCode.ZORK,则编译器无法知道此值是否将在运行时存在于数据库中。即使你想象一个足够聪明的编译器来弄清楚枚举是如何被填充的,并且检查数据库以查看该值是否存在于适当的表中,它也无法知道当你实际运行时它是否存在
简而言之,你想要的是与枚举有很大不同。
答案 3 :(得分:0)
不,这是不可能的,因为必须在编译时定义枚举类型,而您正在寻找的是动态创建它。
如果使用课程,也许你会更好。
答案 4 :(得分:0)
如果你想变得非常疯狂,我认为annotation processing可以做到这一点。注释处理允许您挂钩编译器,并在@annotation
出现时让它神奇地修改。
当然,枚举中的值将是编译时可用的任何值。
答案 5 :(得分:0)
我认为在这里你需要一个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自己的方法而不是制作自己的方法)
答案 6 :(得分:0)
超过你不能,你不想。每个枚举,甚至是Java相当酷的枚举,都是面向代码的。
它与集合完全相同,但是对于枚举,您会在遇到它时编写重复的代码 - 使用集合时,您更有可能编写循环。
我建议您使用私有构造函数创建一个类,并让它创建自己的实例,然后提供getInstance(String)来检索实例。这就像旧的类型安全枚举模式。
但是,从长远来看,如果你能够在这个类中获得足够的智能,而不是在特定的实例上进行区分,那就更好了 - 从“Enum”的方式来看:
if(myEnum.stringValue.equals("EnumTarget"))
executeCode();
以OO的方式:
myEnumLikeObject.executeCode();
将您希望的代码移动到“枚举”中 - 最好直接委托给实例化的包含对象,并在创建时设置为“枚举”。