2012-10-10 17 views
8

mam taką klasę enum w javaJak zwrócić wartość enum przez 2 parametrów w Javie

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

muszę wdrożyć metodę, która zwraca wartość enum przez adapter i parametr kroku.

public MockTypes getMockTypeByName(String adaptor, String step) 

ale nie mam pojęcia jak. Czy ktoś mógłby mi pomóc?

Odpowiedz

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

Dlaczego 'equalsIgnoreCase'? (Naprawdę, naprawdę nie powinno być twoją domyślną wartością). –

+0

@LouisWasserman OP może zamiast tego użyć 'equals()', jeśli chce, to zależy od niego. –

+0

Tak, ale ... żebyś zasugerował, że to dziwne. 'equals' to _default_, no? I nic z wymienionych PO nie oznacza, że ​​obudowa jest problemem? –

1

Można użyć metody enum 'values(), aby uzyskać listę wszystkich zdefiniowanych wartości. Następnie możesz przejrzeć tę listę i znaleźć wartości, które Cię interesują, odpowiadające wartościom przesłanym jako parametry do metody.

+0

Potrzebuję tylko jednej wartości, która pasuje do dwóch parametrów. –

+0

@ConstantineGladky, możesz przechodzić przez to, co 'values ​​()' zwraca, aby znaleźć wartość, której szukasz. 'values ​​()' zwróci listę wszystkich możliwych 'MockTypes'. Można również utworzyć "Mapę", buforując te wartości, jeśli wydajność pętli jest problemem. – rid

2

Jeśli chcesz rozwiązanie „Constant-Time”, która nie wymaga patrząc w górę wartości, najlepszym rozwiązaniem jest, aby zainicjować stałą Map w statycznym bloku w klasie MockType.

Jeśli czujesz się na użyciu Guava, będzie to rzeczywiście być stosunkowo przyjemne:

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

(Ujawnienie: I przyczyniają się do guawy.)

Alternatywą będzie stosunkowo podobna - - skonstruuj Map<String, Map<String, LookupType>> w statycznym bloku i wykonaj odnośniki stamtąd - choć będzie to wymagało nieco więcej pracy.