Best practice Java - Array di stringhe costante e indicizzazione

3

Per le costanti di stringa è usuale usare una classe con valori di final String . Ma qual è la procedura migliore per archiviare gli array di stringhe. Voglio memorizzare diverse categorie in un array costante e ogni volta che una categoria è stata selezionata, voglio sapere a quale categoria appartiene ed elaborare in base a quello.

Aggiunta: per renderlo più chiaro, ho una categoria A,B,C,D,E che è una matrice costante. Ogni volta che un utente fa clic su uno degli elementi (il pulsante avrà quei testi), dovrei sapere su quale elemento è stato fatto clic e l'elaborazione su quello.

Posso definire un enum (ad esempio cat ) e ogni volta fare

if clickedItem == cat.A
 ....
else if clickedItem = cat.B
 ....
else if 
 ....

o persino registrare gli ascoltatori per ciascun elemento separatamente.

Ma volevo sapere le migliori pratiche per gestire questo tipo di problemi.

    
posta 500865 15.11.2011 - 16:28
fonte

3 risposte

6

Preferisco di gran lunga usare Enums per memorizzare costanti di stringa a livello di sistema, semplifica la creazione di funzionalità aggiuntive e ritengo che sia generalmente una best practice accettata.

public enum Cat {
     A() {
          @Override public void execute() { 
               System.out.println("A clicked"); 
          }
     },
     B() {
          @Override public void execute() { 
               System.out.println("B Clicked"); 
          }
     };
     //template method
     public abstract void execute();
}

quindi puoi chiamarlo così:

String clickedItem = "A";    
Cat.valueOf(clickedItem).execute(); //will print A is clicked

oppure potresti anche usare il comando Command senza enumerazioni ....

public interface Cat {
     void do();
}

public class CatA() implements Cat {
     void do() {//put your code here}
}
public class CatB() implements Cat {
     void do() {//put your other code here}
}

quindi costruisci un oggetto Map e compilalo con le istanze Cat:

catMap.put("A", new CatA());
catMap.put("B", new CatB());

allora puoi sostituire il tuo if / else if chain con:

catMap.get(clickedItem).do();
    
risposta data 15.11.2011 - 17:32
fonte
4

La tua descrizione è abbastanza vaga, quindi forse ho sbagliato, ma suona come potresti usare un Map<String,String> per memorizzare le tue relazioni di categoria. Per esempio. se hai

class Foo {
   final static String[] cat1 = {"val1_1","val1_2","val1_3"};
   final static String[] cat2 = {"val2_1","val2_2"};
}

Vorrei scrivere:

class Foo {
  final static Map<String, String> map = new HashMap<String,String>();
  {
     map.put("val1_1","cat1");
     map.put("val1_2","cat1");
     map.put("val1_3","cat1");
     map.put("val2_1","cat2");
     map.put("val2_2","cat2");
  } 
}

Quindi ottenere la categoria è facile come chiamare Foo.map.get("val1_1"); . Ovviamente dovresti essere un po 'più intelligente di me quando riempi la mappa (ad esempio da un file o giù di lì). Se sei interessato alle modifiche della mappa, esegui il wrapping utilizzando Collections.unmodifiableMap .

    
risposta data 15.11.2011 - 16:41
fonte
-1

Per quanto riguarda la tua domanda - non è chiaro che cosa esattamente vuoi ottenere, ma potrei semplicemente darti alcuni consigli generali sull'utilizzo di enum :

  • Una costante enum è un oggetto e il nome della classe enum deve iniziare con maiuscolo ( Cat )
  • Un enum è un insieme fisso e definito di costanti enum. Non usare dove hai bisogno di variabilità.
  • Le enumerazioni possono fare riferimento ad altri oggetti. Si raccomandano riferimenti finali di oggetti immutabili. Questo può essere molto utile per es. per memorizzare le costanti di stringa.
  • La costante enum può essere utilizzata come una chiave di mappa, ma anche come costante del caso di commutazione. È decisamente più bello che usare un albero long se else.
risposta data 24.11.2016 - 15:48
fonte

Leggi altre domande sui tag