Как я могу получить доступ к методам, основанным на строках в массиве? - PullRequest
0 голосов
/ 27 июня 2009

Hello!

Я даже не уверен, возможно ли это, но, надеюсь, это на 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 логических значений. Мне не нравится это решение, и я вижу похожие шаблоны в других bean-компонентах в моей системе.

Кто-нибудь знает, есть ли лучшее решение для этого? Булевы управляющие столбцы, в которых я установил для их отображаемого поля значение true / false в соответствии с содержимым массива флажков.

Я надеялся, что в JSF EL я смогу получить доступ к переменной visibleFields и методу contains, таким образом возвращая либо true, либо false, если объект существует в массиве. Это, похоже, не работает, и EL не дает мне доступ к методу содержимого.

Я сейчас использую:

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], чтобы установить правильную логическую переменную, или я могу превратить это в карту, может быть, и использовать EL JSF, чтобы проверить, существует ли ключ на карте?

Спасибо за ваше время и извините за то, что написали такой длинный вопрос, чтобы добраться до небольшой точки: /

РЕДАКТИРОВАТЬ:

Метод отражения дал 5 исключений, большой блок кода, обрабатывающий их, а также люди сказали, что это дорогой метод. Это заставляет меня верить, что либо мое старое решение, либо использование карт - лучший способ сделать это. Я собираюсь попробовать решение карты =)

Ответы [ 3 ]

3 голосов
/ 27 июня 2009

С отражением , вы можете сделать:

for (String item : getVisibleFields()) {
    getClass().getMethod("get" + capitalize(item)).invoke(this, true);
}

Обработка исключений и метод capitalize оставлены читателю в качестве упражнения (invoke создает лот исключений).

1 голос
/ 27 июня 2009

Вы всегда можете хранить значения на карте. Однако, если вы хотите вызывать методы на основе имени метода в виде строки, используйте отражение. Увидеть http://java.sun.com/developer/technicalArticles/ALT/Reflection/

0 голосов
/ 27 июня 2009

Вы можете использовать API отражения Java для динамического поиска поля и его установки, как в этом примере . Обратите внимание, что у этого метода будет снижение производительности.

...