Como posso acessar métodos baseados em cadeias de caracteres em uma matriz?
-
20-08-2019 - |
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 =)
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
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.