如何以编程方式在Java中获取对枚举的引用?
我正在使用Java1.6和Hibernate3.6.10.Final。我需要根据应用程序中内置的枚举检查几个数据库表的内容。(数据库表往往会偶尔添加或删除值,没有人告诉开发人员。)因此,我想这样做:如何以编程方式在Java中获取对枚举的引用?,java,hibernate,enums,Java,Hibernate,Enums,我正在使用Java1.6和Hibernate3.6.10.Final。我需要根据应用程序中内置的枚举检查几个数据库表的内容。(数据库表往往会偶尔添加或删除值,没有人告诉开发人员。)因此,我想这样做: for (service myService : ListOfServices() ) { enum MyEnum = GoGetCorrespondingEnum(myService); Map<Character, String> databaseMap = mySe
for (service myService : ListOfServices() ) {
enum MyEnum = GoGetCorrespondingEnum(myService);
Map<Character, String> databaseMap = myService.findAll();
if (databaseMap.size() != MyEnum.values().length) {
logger.error("Enum is out of sync with database tableand must be fixed!");
}
}
private static final String[] SERVICE_NAMES = { "ServiceA", "ServiceB" };
private List<String> getCorrespondingValuesFor(service) {
List<String> values = new ArrayList<String>();
for (String serviceName : SERVICE_NAMES) {
if ("ServiceA".equals(myService.class.name)) {
for (EnumForServiceA value : EnumForServiceA.values()) {
values.add(value.name());
}
break;
}
}
return allowedValues;
}
for(服务myService:ListOfServices()){
enum MyEnum=gogetcorrespondingum(myService);
Map databaseMap=myService.findAll();
if(databaseMap.size()!=MyEnum.values().length){
logger.error(“枚举与数据库表不同步,必须修复!”);
}
}
问题是,在第二行中,我不知道如何为我正在查看的服务获取相应的枚举。有人能推荐一个方法吗?为所有服务类添加一个通用方法,其中每个服务都可以返回与之相关的枚举
public Class<? extends Enum<?>> getEnumType() {
return MyEnum.class;
}
你可以这样做:
for (service myService : ListOfServices() ) {
enum MyEnum = GoGetCorrespondingEnum(myService);
Map<Character, String> databaseMap = myService.findAll();
if (databaseMap.size() != MyEnum.values().length) {
logger.error("Enum is out of sync with database tableand must be fixed!");
}
}
private static final String[] SERVICE_NAMES = { "ServiceA", "ServiceB" };
private List<String> getCorrespondingValuesFor(service) {
List<String> values = new ArrayList<String>();
for (String serviceName : SERVICE_NAMES) {
if ("ServiceA".equals(myService.class.name)) {
for (EnumForServiceA value : EnumForServiceA.values()) {
values.add(value.name());
}
break;
}
}
return allowedValues;
}
private static final String[]SERVICE\u NAMES={“ServiceA”,“ServiceB”};
私人列表获取(服务)的对应值{
列表值=新的ArrayList();
for(字符串serviceName:SERVICE\u名称){
if(“ServiceA.equals(myService.class.name)){
for(EnumForServiceA值:EnumForServiceA.values()){
value.add(value.name());
}
打破
}
}
返回允许的值;
}
然后在您展示的代码中使用它(但您应该检查内容,而不仅仅是长度):
for(服务myService:ListOfServices()){
List supportedValues=GetCorrespondingValues for(myService);
以某种方式使用findAll()列出usedValues=getListOfUsedValues();/**/
如果(!supportedValues.containsAll(usedValues)){
logger.error(“枚举与数据库表不同步,必须修复!”);
}
}
重要提示:
既然发生了(并且我不认为“记录一条消息告诉开发人员更新代码以支持新的值”这个问题的解决方案),我会建议其他方法来处理它:
- 限制用户仅在
()中添加值,但它不会处理对数据库的直接更改enum
- 重新构造代码结构和/或数据映射以更好地处理这种情况,而不需要更改代码