如何在Java中通过两个参数返回枚举值

8

我有一个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)

但我不知道该怎么做。有人能帮我吗?
3个回答

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

为什么要使用 equalsIgnoreCase?(它真的不应该成为你的默认选项。) - Louis Wasserman
@LouisWasserman 如果他想的话,OP可以使用equals(),这取决于他。 - Eng.Fouad
是的,但是...你这么建议有点奇怪。equals 是默认值,不是吗?而且,楼主提到的内容并没有暗示大小写会成为问题? - Louis Wasserman
@LouisWasserman,我按照你的建议编辑了我的答案,你是对的,原帖中没有提到大小写敏感的问题 :) - Eng.Fouad
2
顺便说一下有趣的事实:对于枚举类型调用values()会每次重建整个数组,但是迭代EnumSet.allOf(MockTypes.class)只需要O(1)的工作量。 - Louis Wasserman
它有效。我正在考虑这个问题,但如果枚举很大,可能需要一些时间。我正在尝试找到像valueOf(....)这样的解决方案,而不需要迭代枚举值。 - Constantine Gladky

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

(提示:我对Guava做出了贡献。)
另外一种选择相对类似--在静态块中构造一个Map<String, Map<String, LookupType>>,然后从那里进行查找--但这将需要更多的工作。

1
您可以使用enumvalues()方法获取所有定义值的列表。然后,您可以循环遍历此列表,并查找与发送到该方法作为参数的值匹配的值。

我只需要一个符合两个参数的值。 - Constantine Gladky
@ConstantineGladky,你可以循环遍历values()返回的内容以找到你需要的值。values()将返回所有可能的MockTypes列表。如果循环性能是一个问题,你也可以创建一个Map来缓存这些值。 - rid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接