Domanda

Ciao!

Io non sono nemmeno sicuro se questo è possibile, ma si spera è in Java.So che l'ho fatto in PHP utilizzando la variabile di variabili e di accedere a una variabile dinamicamente, ma ho letto che questo non è possibile in Java in una questione diversa.

Ho un array di stringhe che contiene lo stato di caselle di controllo nella mia JSF GUI.Se tutte le caselle di controllo impostare l'array quindi essere riempito con stringhe che contengono il valore di diverse caselle di controllo.

Le etichette e i valori delle caselle di controllo sono costruito da un ciclo attraverso una matrice che assomiglia a questo:

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

Poi ho scorrere l'array e fare JSF SelectItems fuori:

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

Il problema e la soluzione corrente (spero che qualcuno mi possa aiutare, il refactoring in qualcosa di meglio:

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

E così si continua per 11 booleane.Non mi piace questa soluzione, e vedo modelli simili in altre fagioli nel mio sistema.

Qualcuno sa se c'è una soluzione migliore di questa?I valori booleani colonne di controllo dove ho impostato la loro resa in campo per true/false a seconda che la casella di controllo array contiene.

Speravo in EL JSF ho potuto accedere al visibleFields variabile e contiene il metodo, e quindi restituisce true o false se l'oggetto esiste nell'array.Questo non sembra funzionare anche se l'EL non mi dà l'accesso al metodo contains.

Attualmente sto usando:

rendered="#{overviewFilterBean.dob}"

E ho provato con questo codice:

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

Ora, questo mi ha portato a provare ad usare il mio array finale e impostare i valori booleani secondo getFields().contains(OVERVIEW_FIELDS[i][1]), ma come posso rendere questo possibile?

Parte reale e la parte pseudo-codice che segue (la soluzione che mirava ad ora):

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

La grande domanda:

C'è un modo per me di utilizzare il valore da OVERVIEW_FIELDS[i][1] per impostare correttamente la variabile booleana o posso convertirla in una Mappa, magari e utilizzare il JSF EL per verificare se la chiave esiste nella mappa?

Grazie per il vostro tempo, e scusate per la scrittura di una così lunga domanda per ottenere un piccolo punto :/

EDIT:

Il metodo di riflessione ha portato a 5 le eccezioni, grosso blocco di codice, la movimentazione e la gente dice che il suo metodo costoso.Questo mi porta a credere che sia la mia vecchia soluzione o l'utilizzo di mappe è il modo migliore per farlo.Im andando a cercare la soluzione di mappa =)

È stato utile?

Soluzione

Non sempre si può memorizzare i valori in una mappa piuttosto.Tuttavia, se si desidera richiamare i metodi basati sul methodname come una stringa, utilizzare la reflection.Vedere http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Altri suggerimenti

Con riflessione, si può fare:

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

La gestione delle eccezioni e il capitalize metodo sono lasciati come esercizio per il lettore (invoke lancia un sacco di eccezioni).

È possibile utilizzare il Java reflection API per cercare il campo in modo dinamico e impostare, come in questo esempio.Nota che ci sarà un calo di prestazioni a questo metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top