2009-06-26 6 views
0

Bonjour!Comment puis-je accéder à des méthodes basées sur des chaînes dans un tableau?

Je ne sais même pas si c'est possible, mais j'espère que c'est en Java. Je sais que je l'ai fait en PHP en utilisant des variables variables et en accédant dynamiquement à une variable, mais j'ai lu que ce n'est pas possible en Java dans une question différente.

J'ai un tableau de chaînes qui contient l'état des cases à cocher dans mon interface graphique JSF. Si toutes les cases sont cochées, le tableau sera rempli de chaînes contenant la valeur de différentes cases à cocher.

Les étiquettes et les valeurs des cases sont construites par une boucle à travers un tableau qui ressemble à ceci:

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

J'itérer dans le tableau et faire SelectItems JSF sortir:

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

Le problème et la solution actuelle (j'espère que quelqu'un peut m'aider à le refactoriser en quelque chose de mieux:

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

Et ainsi de suite, il continue pour 11 booléens. Je n'aime pas cette solution, et je vois des modèles similaires dans d'autres haricots dans mon système.

Est-ce que quelqu'un sait s'il y a une meilleure solution à cela? Les booléens contrôlent les colonnes où je place leur champ rendu à true/false en fonction de ce que contient le tableau checkbox. J'espérais dans le JSF EL que je pouvais accéder à la variable visibleFields et à la méthode contains, renvoyant ainsi true ou false si l'objet existait dans le tableau. Cela ne semble pas fonctionner et l'EL ne me donne pas accès à la méthode contains.

J'utilise actuellement:

rendered="#{overviewFilterBean.dob}" 

et moi avons essayé avec ce code:

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

Maintenant, cela m'a amené à essayer d'utiliser mon tableau final et définir les booléens selon getFields().contains(OVERVIEW_FIELDS[i][1]), mais comment puis-je rendre cela possible?

code pseudo réel et une partie partie suit (la solution que je visais pour l'instant):

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

La grande question:

est pour moi il y a un moyen d'utiliser la valeur de OVERVIEW_FIELDS[i][1] pour définir la variable booléenne correcte ou puis-je transformer cela en une carte peut-être et utiliser le JSF EL pour vérifier si la clé existe dans la carte?

Merci pour votre temps, et désolé pour écrire une question longue pour arriver à un petit point:/

EDIT:

La méthode de réflexion a donné lieu à 5 exceptions, grand bloc de code les manipuler et aussi les gens ont dit que c'est une méthode coûteuse.Cela m'amène à croire que mon ancienne solution ou en utilisant des cartes est la meilleure façon de le faire. Je vais essayer la solution de carte =)

Répondre

0

Vous pouvez utiliser l'API de réflexion Java pour rechercher dynamiquement le champ et le définir, comme dans this example. Notez qu'il y aura un hit de performance à cette méthode.

3

Avec reflection, vous pouvez faire:

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

gestion des exceptions et la méthode capitalize sont laissés comme un exercice au lecteur (invoke jette un beaucoup des exceptions).

+0

Bonjour, et merci d'avoir montré le code de cette manière. C'est très vrai comme vous le dites, cela génère des tonnes d'exceptions, et si c'est une façon très coûteuse de faire les choses, peut-être mieux d'essayer simplement sur chaque booléen IM? –

+0

Oui, ce serait mieux si vous aviez une liste contenant seulement les champs booléens (j'ai mal compris votre question quand j'ai écrit ceci). Mais si vous aviez une telle liste, vous pourriez aussi bien en faire une carte, comme le suggère noselasd. –

+0

oui j'ai accepté sa réponse, parce que j'ai découvert que dans JSF EL je pourrais simplement faire rendu = "# {! Vide testBean.map ['test']}" et peupler la carte au lieu de mettre les boolos! Merci –

Questions connexes