Как я могу получить доступ к методам, основанным на строках в массиве?
-
20-08-2019 - |
Вопрос
Привет!
Я даже не уверен, возможно ли это, но надеюсь, что это на Java.Я знаю, что сделал это в PHP, используя переменные переменные и динамически обращаясь к переменной, но я прочитал, что это невозможно в Java в другом вопросе.
У меня есть массив строк, который содержит состояние флажков в моем графическом интерфейсе JSF.Если все флажки установлены, массив будет заполнен строками, содержащими значения различных флажков.
Метки и значения флажков создаются путем обхода массива, который выглядит следующим образом:
private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"},
{"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"},
..., ..., ...};
Затем я перебираю массив и создаю из него JSF SelectItems:
for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]);
getFields().add(item);
}
Проблема и текущее решение (надеюсь, кто-нибудь поможет мне преобразовать ее во что-то лучшее:
for (String item : getVisibleFields()) {
if (item.equals("dob")) {
setDob(true);
}
if (item.equals("requestTitle")) {
setRequestTitle(true);
}
if (item.equals("processId")) {
setProcessId(true);
}
if (...) {
}
}
И так далее для 11 логических значений.Мне не нравится это решение, и я вижу аналогичные закономерности в других компонентах моей системы.
Кто-нибудь знает, есть ли лучшее решение для этого?Логические значения управляют столбцами, в которых я устанавливаю для отображаемого поля значение true/false в зависимости от того, что содержит массив флажков.
Я надеялся, что в JSF EL я смогу получить доступ к переменнойvisibleFields и методу contains, возвращая таким образом либо true, либо false, если объект существует в массиве.Однако это, похоже, не работает, и EL не дает мне доступа к методу contains.
В настоящее время я использую:
rendered="#{overviewFilterBean.dob}"
И я попробовал с этим кодом:
rendered="#{overviewFilterBean.visibleFields.contains['dob']}">
Теперь это побудило меня попытаться использовать мой последний массив и установить логические значения в соответствии с getFields().contains(OVERVIEW_FIELDS[i][1])
, но как я могу сделать это возможным?
Далее следует частично реальный и частично псевдокод (решение, к которому я сейчас стремился):
for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
if (item.equals(OVERVIEW_FIELDS[i][1])) {
setOVERVIEW_FIELDS[i][1](true);
}
}
Большой вопрос:
Есть ли способ использовать значение из OVERVIEW_FIELDS[i][1]
чтобы установить правильную логическую переменную, или я могу превратить это в карту и использовать JSF EL, чтобы проверить, существует ли ключ на карте?
Спасибо, что уделили время, и извините, что написал такой длинный вопрос, чтобы добраться до мелочей :/
РЕДАКТИРОВАТЬ:
Метод отражения привел к 5 исключениям, большому блоку кода, обрабатывающему их, а также люди сказали, что это дорогой метод.Это наводит меня на мысль, что лучшим способом сделать это будет либо мое старое решение, либо использование карт.Попробую решение с картой =)
Решение
Вы всегда можете сохранить значения на карте.Однако если вы хотите вызывать методы на основе имени метода в виде строки, используйте отражение.Видетьhttp://java.sun.com/developer/technicalArticles/ALT/Reflection/
Другие советы
Вы можете использовать API отражения Java для динамического поиска поля и его установки, как в этот пример.Обратите внимание, что этот метод приведет к снижению производительности.