Pergunta

Olá!

Eu nem tenho certeza se isso é possível, mas espero que seja em Java. Eu sei que eu tenho feito isso em PHP, utilizando variáveis ??variáveis ??e acessar uma variável dinamicamente, mas eu li isso não é possível em Java em uma pergunta diferente.

Eu tenho uma matriz de strings que contém o estado de caixas de seleção em meu JSF GUI. Se todas as caixas estão definir a matriz irá então ser preenchido com cadeias que contêm o valor de diferentes caixas de selecção.

Os rótulos e os valores das caixas são construídas por looping através de um conjunto que se parece com isso:

private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"},
    {"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"},
..., ..., ...};

Então eu iterate através da matriz e fazer JSF ItensSelecionados fora dele:

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
    SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]);
    getFields().add(item);
}

A solução do problema e corrente (espero que alguém pode me ajudar a refatorar-lo em algo melhor:

for (String item : getVisibleFields()) {
           if (item.equals("dob")) {
                setDob(true);
            }
            if (item.equals("requestTitle")) {
                setRequestTitle(true);
            }
            if (item.equals("processId")) {
                setProcessId(true);
            }
            if (...) {
            }
}

E assim por diante ele continua durante 11 booleans. Eu não gosto dessa solução, e eu ver padrões semelhantes em outros feijões no meu sistema.

Alguém sabe se há uma solução melhor para isso? Os booleans controlar colunas onde eu definir seu campo prestados para true / false acordo com o que o conjunto caixa contém.

Eu estava esperando na JSF EL eu poderia acessar a variável VisibleFields eo método contém, retornando, assim, verdadeira ou falsa se a exist objeto na matriz. Este não parece trabalho embora e que a EL não me dá acesso ao método contém.

Eu estou usando atualmente:

rendered="#{overviewFilterBean.dob}"

E eu tentei com este código:

rendered="#{overviewFilterBean.visibleFields.contains['dob']}">

Agora, isso me levou a tentar usar minha matriz final e definir as booleans acordo com getFields().contains(OVERVIEW_FIELDS[i][1]), mas como eu posso tornar isso possível?

parte real e parte pseudo código segue (a solução que eu estava apontando para agora):

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
    if (item.equals(OVERVIEW_FIELDS[i][1])) {
           setOVERVIEW_FIELDS[i][1](true);
       }
    }

A grande questão:

Existe uma maneira para eu usar o valor de OVERVIEW_FIELDS[i][1] para definir a variável booleana correta ou eu posso transformar isso em um Mapa talvez e usar o JSF EL para verificar se existe chave no mapa?

Obrigado por seu tempo, e pena de escrever uma pergunta tão longa para chegar a um pequeno ponto: /

EDIT:

O método de reflexão resultou em 5 exceções, grande bloco de código de manipulação e também pessoas disseram que seu um método caro. Isto leva-me a crer que seja o meu velho solução ou usando mapas é a melhor maneira de fazê-lo. Eu vou tentar a solução map =)

Foi útil?

Solução

Você sempre pode armazenar os valores em um mapa bastante. No entanto, se você quiser chamar métodos baseados na methodname como uma string, o uso de reflexão. Vejo http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Outras dicas

Com reflexão , você pode fazer:

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

A manipulação de exceção e o método capitalize são deixados como um exercício para o leitor ( invoke lança um muito de exceções).

Você pode usar a API de reflexão Java para procurar o campo de forma dinâmica e configurá-lo, como em neste exemplo . Note-se que haverá um acerto de desempenho para este método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top