2012-10-10 29 views
8

tengo esa clase de enumeración de javaCómo devolver valor de enumeración por 2 parámetros en 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; 
     } 

tengo que poner en práctica el método que devuelve valor de enumeración por el adaptador y el parámetro de paso.

public MockTypes getMockTypeByName(String adaptor, String step) 

pero no tengo idea de cómo. ¿Alguien podría ayudarme?

Respuesta

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

¿Por qué 'equalsIgnoreCase'? (Realmente, realmente no debería ser su valor predeterminado.) –

+0

@LouisWasserman El OP puede usar 'equals()' en su lugar si lo desea, depende de él. –

+0

Sí, pero ... para que sugieras que es extraño. 'equals' es el _default_, no? ¿Y nada de lo que menciona el OP implica que el revestimiento es un problema? –

1

Puede usar el método enumvalues() para obtener una lista de todos los valores definidos. A continuación, puede recorrer esta lista y encontrar los valores que le interesan que coincidan con los enviados como parámetros del método.

+0

Necesito solo un valor que coincida con dos parámetros –

+0

@ConstantineGladky, puede recorrer lo que 'values ​​()' regresa para encontrar el valor que está buscando. 'values ​​()' devolverá una lista de todos los posibles 'MockTypes'. También puede hacer un 'Mapa', almacenando en caché estos valores, si el rendimiento del bucle es una preocupación. – rid

2

Si desea una solución "constante de tiempo" que no implica la búsqueda de valores, su mejor opción es inicializar una constante Map en un bloque estático de la clase MockType.

Si usted está listo para el uso Guava, que en realidad va a ser relativamente agradable:

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); 
    } 
} 

(Revelación: Contribuyo a guayaba.)

La alternativa va a ser relativamente similares - - construye un Map<String, Map<String, LookupType>> en un bloque estático, y realiza búsquedas desde allí, aunque requerirá un poco más de trabajo.

Cuestiones relacionadas