2012-10-10 7 views
8

Tôi có lớp enum như vậy trong javaLàm thế nào để trả lại giá trị enum bởi 2 thông số trong 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; 
     } 

tôi phải thực hiện phương thức trả về giá trị enum bởi adapter và tham số bước.

public MockTypes getMockTypeByName(String adaptor, String step) 

nhưng tôi không biết làm cách nào. Có ai có thể giúp tôi không?

Trả lời

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

Tại sao 'equalsIgnoreCase'? (Nó thực sự, thực sự không nên là mặc định của bạn.) –

+0

@LouisWasserman OP có thể sử dụng 'equals()' thay vào đó nếu anh ta muốn, nó tùy thuộc vào anh ta. –

+0

Có, nhưng ... để bạn có thể gợi ý nó là lạ. 'bằng' là _default_, không? Và không có gì được đề cập của OP ngụ ý rằng vỏ bọc là một vấn đề? –

1

Bạn có thể sử dụng phương thức enum's values() để nhận danh sách tất cả các giá trị đã xác định. Sau đó, bạn có thể lặp qua danh sách này và tìm các giá trị bạn quan tâm phù hợp với các giá trị được gửi dưới dạng tham số cho phương thức.

+0

Tôi chỉ cần một giá trị khớp với hai tham số –

+0

@ConstantineGladky, bạn có thể lặp lại giá trị 'values ​​()' để tìm giá trị bạn đang tìm kiếm. 'values ​​()' sẽ trả về một danh sách tất cả các 'MockTypes' có thể có. Bạn cũng có thể tạo một 'Bản đồ', lưu vào bộ nhớ đệm các giá trị này nếu hiệu suất vòng lặp là một mối quan tâm. – rid

2

Nếu bạn muốn có một "liên tục thời gian" giải pháp mà không liên quan đến tìm kiếm các giá trị, lựa chọn tốt nhất của bạn là để khởi tạo một hằng số Map trong một khối tĩnh trong lớp MockType.

Nếu bạn đang lên cho sử dụng Guava, nó sẽ thực sự là tương đối dễ chịu:

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

(Tiết lộ: Tôi đóng góp cho ổi.)

Việc thay thế sẽ là tương đối giống nhau - - xây dựng một Map<String, Map<String, LookupType>> trong một khối tĩnh, và tìm kiếm từ đó - mặc dù nó sẽ yêu cầu phần nào làm việc nhiều hơn.