从Java中获取Enum Object的值。

Getting Enum Object from its value in Java. In Efficient way and Not using Map

本问题已经有最佳答案,请猛点这里访问。

Enum类中,如何使用其字段值之一获取Enum对象的名称。

1
2
3
4
public enum Example {
    Object1("val1","val2"),
    Object2("val3","val4");
}

我随身带着埃多克斯一号[二号]。我可以让Object1使用它吗?


如果可以确保每个enum常量都具有唯一的第一个值,那么可以按照以下方法对O(1)复杂性进行此操作。我们必须创建内部类来管理val1Example的映射,因为enum不允许我们在构造函数内部的静态映射中添加值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public enum Example {
    Object1("val1","val2"), Object2("val3","val4");

    private static final class ExampleValManager {
        static final Map<String, Example> EXAMPLE_VAL_MANAGER_MAP = new HashMap<>();
    }

    private String val1;

    private String val2;

    private Example(String val1, String val2) {
        this.val1 = val1;
        this.val2 = val2;
        ExampleValManager.EXAMPLE_VAL_MANAGER_MAP.put(val1, this);
    }

    public static Example getExampleByVal1(String val) {
        return ExampleValManager.EXAMPLE_VAL_MANAGER_MAP.get(val);
    }
}

使用方法如下:

1
2
3
4
5
6
public class Test {

   public static void main(String[] args) {
       System.out.println(Example.getExampleByVal1("val1"));
   }
}

产量

1
Object1


您的enum如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public enum Example {
    Object1("val1","val2"),
    Object2("val3","val4");

    String str1;
    String str2;

    Example(String str1, String str2){
        this.str1 = str1;
        this.str2 = str2;
    }

    static Example getEnumByStr1(String str1){
        for (Example e : values())
            if (e.str1.equals(str1))
                return e;
        return null;
    }
}

您可以通过字符串值获取枚举,然后如下所示:

1
Example.getNameByStr1("val1");


实际上,您没有显示这些字符串对应的任何内容,因此我假设您有名为foobar的字段:

1
2
3
4
5
6
7
8
9
public enum Example {
    final String foo;
    final String bar;

    private Example(String foo, String bar) {
        this.foo = foo;
        this.bar = bar;
    }
}

为了通过foo查找,您只需要一些查找匹配项的方法:

1
2
3
4
5
6
7
8
public static Example ofFoo(String foo) {
    for(Example e : Example.values()) {
        if(e.foo.equals(foo))
            return e;
    }

    return null;
}

只要你没有一个疯狂的枚举值,这通常是好的。如果性能实际上是一个问题,您可以在私有静态数组中缓存Example.values(),甚至可以设置类似于guava ImmutableMap的东西。