Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用字符串数组声明java枚举_Java_Arrays_Enums - Fatal编程技术网

用字符串数组声明java枚举

用字符串数组声明java枚举,java,arrays,enums,Java,Arrays,Enums,我试图根据从数据库检索的数据声明枚举类型。我有一个方法,它返回表中所有行的字符串数组,我想将这些行转换为枚举类型。有没有办法用数组构造枚举 这是我尝试过的,但从eclipse中的外观来看,它似乎只是创建了一个同名的方法: public enum ConditionCodes{ Condition.getDescriptions(); } 提前谢谢你 你不能 enum的值必须在编译时已知。如果您还有其他内容,那么它不是enum 您可以通过一个类似于Java语言通过enum关键字引入对该技

我试图根据从数据库检索的数据声明枚举类型。我有一个方法,它返回表中所有行的字符串数组,我想将这些行转换为枚举类型。有没有办法用数组构造枚举

这是我尝试过的,但从eclipse中的外观来看,它似乎只是创建了一个同名的方法:

public enum ConditionCodes{
    Condition.getDescriptions();
}
提前谢谢你

你不能

enum
的值必须在编译时已知。如果您还有其他内容,那么它不是
enum


您可以通过一个类似于Java语言通过
enum
关键字引入对该技术的支持之前所使用的实现来实现。您可以使用这些技术,但只需将
静态final
字段替换为从DB读取的值。

不,这是不可能的,因为枚举类型必须在编译时定义,您需要的是动态创建它


如果改用类,可能会更好。

要使枚举有用,必须在编译时确定它。从数据库查询生成枚举意味着您希望在运行时看到新的枚举值。即使您创建了一个代码生成器来使用数据库查询动态创建枚举类,您也无法在代码中引用这些枚举值,这就是拥有它们的意义所在。

如果您真的想发疯,我想可以这样做。注释处理允许您钩住编译器,并让它在出现
@Annotation
时神奇地修改内容


当然,枚举中的值将是编译时可用的任何值。

我认为这里需要一个列表或集合,以及一些用于搜索和比较的实用方法

这是你的名单

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

(当然,你可能会想使用List自己的方法,而不是自己制作)

你不想做的更多。每个枚举,甚至Java相当酷的枚举,都是面向代码的

它与集合完全相同,但对于枚举,每当遇到它时,您往往会编写重复的代码——对于集合,您更有可能编写循环

我建议您使用私有构造函数创建一个类,并让它创建自身的实例,然后提供一个getInstance(String)来检索实例。这类似于旧的类型安全枚举模式

但是,从长远来看,如果您能够设法在某个类中获得足够的智能,而在某个特定实例中您永远不会有任何差异,那么最好从“枚举”方式开始:

if(myEnum.stringValue.equals("EnumTarget"))
    executeCode();
myEnumLikeObject.executeCode();
对于OO的操作方式:

if(myEnum.stringValue.equals("EnumTarget"))
    executeCode();
myEnumLikeObject.executeCode();

将您希望的代码移动到“枚举”中——最好直接委托给一个包含的对象,该对象在创建时被实例化并设置到“枚举”中。

很难看出任何编译器如何支持这一点

枚举的全部要点应该是在编译时检查值的有效性。比如说,如果您声明了一个枚举“enum MyStatusCode{FOO,BAR,PLUGH}”,那么在您的代码中,如果您编写“MyStatusCode.FOO”,一切都很好,但是如果您编写“MyStatusCode.ZORK”,则会出现编译时错误。这可以防止拼写错误的值或混淆一个枚举与另一个枚举的值。(我最近遇到了一个问题,一个程序员意外地将交付方法分配给了一个事务类型,从而神奇地将销售更改为库存调整,而他打算将送货更改为客户提货。)

但是,如果您的值是在运行时动态定义的,那么编译器如何做到这一点呢?如果您在上面的示例中编写了MyStatusCode.ZORK,那么编译器无法知道该值在运行时是否会出现在数据库中。即使您设想一个编译器足够聪明,能够弄清楚枚举是如何填充的,并检查数据库以查看该值现在是否存在于适当的表中,它也无法知道在您实际运行时它是否存在


简而言之,您需要的是与枚举非常不同的东西。

您还可以编写代码,从数据库中检索值,生成一个.java文件,用这些值声明枚举,然后从那里编译代码。@Sean:是的,这很聪明,但也很脆弱。无论如何,你会失去
enum
的大部分优势,那么为什么要花这么多的时间来获得这么少的好处呢?我同意这有点复杂,但这是关于Android应用程序在资源方面的作用。例如,枚举比比较原始字符串常量(例如,
foo.equals(“某物”)
foo==Things.SOMETHING
)要好,因为您可以进行编译时类型检查。这是一种自动维护枚举的方法。@Sean:我理解,但通过实现我在回答中链接的类型安全枚举模式的变体,同样可以很好地实现这一目标。这就少了很多黑魔法,我就是这么想的。非常感谢。