Как программно получить ссылку на перечисление в Java?

1

Я использую Java 1.6 и Hibernate 3.6.10.Final. Мне нужно проверить содержимое нескольких таблиц базы данных на enums, встроенные в наше приложение. (Таблицы базы данных, как правило, добавляют значения и иногда удаляются, и никто не говорит разработчикам.) Поэтому при запуске я хотел бы сделать что-то вроде этого:

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

Уловка, во второй строке, я не знаю, как получить соответствующее перечисление для службы, на которую я смотрю. Может ли кто-нибудь предложить метод?

  • 0
    Код, основанный на существовании записей базы данных, по своей сути кажется проблематичным. Можете ли вы полностью удалить это из базы данных?
  • 0
    К сожалению нет. Сотрудники базы данных хотят получить информацию в БД для целей отчетности, а сотрудники приложения хотят получить информацию в приложении для удобства чтения кода. Я оказался зажатым между этими двумя требованиями. Я просто пытаюсь удержать приложение от взрыва на пользователях.
Теги:
hibernate
enums

2 ответа

1
Лучший ответ

Добавьте общий метод ко всем вашим классам услуг, где каждая служба может вернуть перечисление, с которым оно связано.

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

Затем в вашем коде, который проверяет количество значений в перечислении для данного использования службы

myService.getEnumType().getEnumConstants().length;
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!");
    }
}

Важный:

Поскольку это происходит (и я не считаю, что "протоколирование сообщения, в котором разработчикам сообщается об обновлении кода для поддержки новых значений", решение проблемы), я бы предложил другие способы его решения:

  • Ограничьте пользователя добавлением только значений в enum (см. Здесь), но он не будет обрабатывать прямые изменения в базе данных
  • Перестройте структуру кода и/или сопоставление данных, чтобы лучше обрабатывать эти вхождения, не требуя изменений кода

Ещё вопросы

Сообщество Overcoder
Наверх
Меню