2012-10-10 32 views
8

返回枚舉值我在Java如何通過2個參數在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; 
     } 

我要實現的方法,通過適配器和步長參數返回枚舉值有這樣的枚舉類。

public MockTypes getMockTypeByName(String adaptor, String step) 

但我不知道如何。有人能幫助我嗎?

回答

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

爲什麼'equalsIgnoreCase'? (這真的不應該是你的默認設置。) –

+0

@LouisWasserman如果他願意,OP可以使用'equals()',這取決於他。 –

+0

是的,但是...因爲你建議它很奇怪。 'equals'是_default_,不是?並沒有提到OP的意思是套管是一個問題? –

1

您可以使用enumvalues()方法來獲取所有定義值的列表。然後,您可以遍歷此列表,找到您感興趣的值,並將這些值與作爲參數發送給方法的值相匹配。

+0

我只需要一個與兩個參數 –

+0

@ConstantineGladky相匹配的值,您可以循環'values()'返回的值來查找您正在查找的值。 'values()'將返回所有可能的'MockTypes'列表。如果循環性能是一個問題,你也可以創建一個'Map',緩存這些值。 – rid

2

如果你希望有一個「固定時間」的解決方案,不涉及查找值,最好的選擇是在MockType類中的靜態塊初始化一個恆定Map

如果你起來使用Guava,它會實際上是相當愉快:

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

(披露:我對番石榴貢獻。)

的替代將是比較相似 - - 在靜態塊中構建一個Map<String, Map<String, LookupType>>,並從那裏進行查找 - 儘管這需要更多的工作。