Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中如何通过2个参数返回枚举值_Java_Enums - Fatal编程技术网

java中如何通过2个参数返回枚举值

java中如何通过2个参数返回枚举值,java,enums,Java,Enums,我在java中有这样的枚举类 public enum MockTypes { // Atlantis mocks ATLANTIS_VERIFY("ATLANTIS", "verify"), ATLANTIS_CREATE_RECORD("ATLANTIS", "createRecord"), ... private String m_adaptor; private String m_

我在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)

但我不知道怎么做。有人能帮我吗?

您可以使用
enum
values()
方法获取所有定义值的列表。然后,您可以循环浏览此列表,找到您感兴趣的值,这些值与作为参数发送给该方法的值相匹配。

如果您想要一个不需要查找值的“常量时间”解决方案,最好的选择是在
MockType
类的静态块中初始化常量
映射

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;
}
如果您准备使用,它实际上会比较令人愉快:

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);
  }
}
公共枚举MockType{
...
私有静态最终不可变表查找_表;
静止的{
不可变的.Builder=
不可变的.builder();
对于(MockType MockType:MockType.values()){
put(mockType.getAdapter(),mockType.getStep(),mockType);
}
LOOKUP_TABLE=builder.build();
}
公共静态MockType getMockType(字符串适配器、字符串步骤){
返回LOOKUP_TABLE.get(适配器,步骤);
}
}
(披露:我为番石榴捐款。)


另一种选择是相对类似的——在静态块中构造一个
映射,并从那里进行查找——尽管这需要更多的工作。

我只需要一个匹配两个的值parameters@ConstantineGladky,您可以循环通过
values()
返回的内容来查找您要查找的值
values()
将返回所有可能的
mocktype
的列表。如果循环性能是一个问题,您还可以制作一个
映射
,缓存这些值。为什么
equalsIgnoreCase
?(这真的,真的不应该是你的默认设置。)@LouisWasserman OP可以使用
equals()
,如果他愿意的话,这取决于他。是的,但是……你认为这很奇怪
equals
是默认值,否?OP提到的任何东西都不意味着大小写是个问题?@LouisWasserman我按照你的建议编辑了我的答案,你是对的OP没有提到任何区分大小写的内容:)有趣的事实,顺便说一句:为枚举类型调用
values()
每次都会重建整个数组,但会在
EnumSet.allOf(MockTypes.class)上迭代
只有O(1)起作用。