【问题标题】:How to programmatically get a reference to an enum in Java?如何以编程方式获取对 Java 中枚举的引用?
【发布时间】:2014-06-11 19:42:11
【问题描述】:

我正在使用 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!");
    }
}

问题是,在第二行中,我不知道如何为我正在查看的服务获取相应的枚举。谁能推荐一个方法?

【问题讨论】:

  • 依赖于数据库记录存在的代码听起来天生就有问题,你能把它完全移出数据库吗?
  • 不幸的是,没有。数据库人员希望数据库中的信息用于报告目的,应用程序人员希望应用程序中的信息用于代码可读性目的。我被夹在这两个要求之间。我只是想防止应用程序在用户面前爆炸。

标签: java hibernate enums


【解决方案1】:

你可以这样做:

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

重要:

既然它发生了(而且我不认为“记录一条消息告诉开发人员更新代码以支持新值”是解决问题的方法),我会建议其他方法来处理它:

  • 限制用户仅在 enum (see here) 中添加值,但它不会处理对数据库的直接更改
  • 重构代码结构和/或数据映射以更好地处理这种情况,无需更改代码

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多