2012-10-10 12 views
8

Ho una tale classe enum in JavaCome restituire valore enum da 2 parametri in Java

public enum MockTypes 
    { 
     // Atlantis mocks 
     ATLANTIS_VERIFY("ATLANTIS", "verify"), 
     ATLANTIS_CREATE_RECORD("ATLANTIS", "createRecord"), 

    ... 

     private String m_adaptor; 

     private String m_step; 

private MockTypes(String adaptor, String step) 
    { 
     m_adaptor = adaptor; 
     m_step = step; 
    } 

      public String getAdaptor() 
     { 
      return m_adaptor; 
     } 

     public String getStep() 
     { 
      return m_step; 
     } 

devo implementare metodo che restituisce valore enum da adattatore e il parametro passo.

public MockTypes getMockTypeByName(String adaptor, String step) 

ma non ho idea di come. Qualcuno potrebbe aiutarmi?

risposta

10
public MockTypes getMockTypeByName(String adaptor, String step) 
{ 
    for(MockTypes m : MockTypes.values()) 
    { 
     if(m.getAdaptor().equals(adaptor) && 
      m.getStep().equals(step)) return m; 
    } 
    return null; 
} 
+0

Perché 'equalsIgnoreCase'? (Davvero, davvero non dovrebbe essere il tuo default.) –

+0

@LouisWasserman L'OP può usare 'equals()' invece, se vuole, dipende da lui. –

+0

Sì, ma ... per te suggerire che è strano. 'equals' è il _default_, no? E nulla dell'OP menzionato implica che l'involucro sia un problema? –

1

È possibile utilizzare il metodo values() per ottenere un elenco di tutti i valori definiti. Puoi quindi scorrere l'elenco e trovare i valori che ti interessano che corrispondono a quelli inviati come parametri al metodo.

+0

Ho bisogno di un solo valore che corrisponda a due parametri –

+0

@ConstantineGladky, è possibile eseguire il looping di ciò che 'values ​​()' restituisce per trovare il valore che si sta cercando. 'values ​​()' restituirà una lista di tutti i possibili 'MockTypes'. Si potrebbe anche creare una 'Mappa', memorizzando nella cache questi valori, se la prestazione del ciclo è un problema. – rid

2

Se si desidera una soluzione "costante di tempo" che non coinvolge cercare i valori, la soluzione migliore è quella di inizializzare una costante Map in un blocco statico nella classe MockType.

Se siete in su per l'utilizzo di Guava, sarà in realtà essere relativamente piacevole:

public enum MockType { 
    ... 

    private static final ImmutableTable<String, String, MockType> LOOKUP_TABLE; 

    static { 
    ImmutableTable.Builder<String, String, MockType> builder = 
     ImmutableTable.builder(); 
    for (MockType mockType : MockType.values()) { 
     builder.put(mockType.getAdaptor(), mockType.getStep(), mockType); 
    } 
    LOOKUP_TABLE = builder.build(); 
    } 

    public static MockType getMockType(String adaptor, String step) { 
    return LOOKUP_TABLE.get(adaptor, step); 
    } 
} 

(Disclosure: contribuisco a Guava.)

L'alternativa sta per essere relativamente simili - - Costruisci un Map<String, Map<String, LookupType>> in un blocco statico e fai le ricerche da lì - anche se richiederà un po 'più di lavoro.