如何以编程方式获取Java中枚举的引用?

时间:2014-04-25 22:34:07

标签: java hibernate enums

我使用的是Java 1.6和Hibernate 3.6.10.Final。我需要根据应用程序内置的枚举来检查几个数据库表的内容。 (数据库表往往会偶尔添加和删除值,没有人告诉开发人员。)所以on startup我想做这样的事情:

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!");
    }
}

问题是,在第二行中,我不知道如何获得我正在查看的服务的相应枚举。有谁能建议一种方法?

2 个答案:

答案 0 :(得分:1)

为所有服务类添加一个通用方法,其中每个服务都可以返回与其相关的枚举。

public Class<? extends Enum<?>> getEnumType() {
    return MyEnum.class;
}

然后在您的代码中验证给定服务使用的枚举中的值的数量

myService.getEnumType().getEnumConstants().length;

答案 1 :(得分:0)

你可以这样做:

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 (Service myService : ListOfServices()) {
    List<String> supportedValues = getCorrespondingValuesFor(myService);
    List<String> usedValues = getListOfUsedValues(); /*using findAll() someway*/
    if (!supportedValues.containsAll(usedValues)) {
        logger.error("Enum is out of sync with database tableand must be fixed!");
    }
}

重要:

因为它发生了(我不会考虑&#34;记录消息告诉开发人员更新代码以支持新值&#34;问题的解决方案),我建议其他方法处理它:

  • 限制用户仅添加enumsee here)中的值,但不会处理对数据库的直接更改
  • 重构代码结构和/或数据映射以更好地处理这些事件,而不需要更改代码