从枚举值中获取枚举名称

Cam*_*lla 35 java enums

我已经阅读了很多关于如何enum使用java从其值获取相应的名称,但没有任何示例似乎对我有用!怎么了?

public class Extensions {


    public enum RelationActiveEnum
    {
        Invited(0),
        Active(1),
        Suspended(2);

        private final int value;

        private RelationActiveEnum(final int value) {
            this.value = value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

}

在我使用的另一个课程中:

        int dbValue = supp.ACTIVE;
        Extensions.RelationActiveEnum enumValue(dbValue);
        String stringName = enumValue.toString(); //Visible
        // OR
        int dbValuee = supp.ACTIVE;
        String stringValue = Enum.GetName(typeof(RelationActiveEnum), dbValue);
Run Code Online (Sandbox Code Playgroud)

我应该工作吧?但它不!它告诉我dbValue cannote可以转换为RelationActiveEnum ...

Veg*_*ger 49

说我们有:

public enum MyEnum {
  Test1, Test2, Test3
}
Run Code Online (Sandbox Code Playgroud)

要获取枚举变量的名称,请使用name():

MyEnum e = MyEnum.Test1;
String name = e.name(); // Returns "Test1"
Run Code Online (Sandbox Code Playgroud)

要从(字符串)名称获取枚举,请使用valueOf():

String name = "Test1";
MyEnum e = Enum.valueOf(MyEnum.class, name);
Run Code Online (Sandbox Code Playgroud)

如果需要integer值与枚举字段匹配,请扩展枚举类:

public enum MyEnum {
  Test1(1), Test2(2), Test3(3);

  public final int value;

  MyEnum(final int value) {
     this.value = value;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

MyEnum e = MyEnum.Test1;
int value = e.value; // = 1
Run Code Online (Sandbox Code Playgroud)

并使用整数值查找枚举:

MyEnum getValue(int value) {
  for(MyEnum e: MyEunm.values()) {
    if(e.value == value) {
      return e;
    }
  }
  return null;// not found
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议在找不到值的情况下抛出异常:InvalidArgumentException (2认同)

Gar*_*vis 38

既然你的'价值'也恰好与你可以做的顺序相符:

public enum RelationActiveEnum {
    Invited,
    Active,
    Suspended;

    private final int value;

    private RelationActiveEnum() {
        this.value = ordinal();
    }
}
Run Code Online (Sandbox Code Playgroud)

从价值中得到一个枚举:

int value = 1;
RelationActiveEnum enumInstance = RelationActiveEnum.values()[value];
Run Code Online (Sandbox Code Playgroud)

我想一个静态方法是一个很好的地方放这个:

public enum RelationActiveEnum {
     public static RelationActiveEnum fromValue(int value) 
             throws IllegalArgumentException {
         try {
              return RelationActiveEnum.values()[value]
         } catch(ArrayIndexOutOfBoundsException e) {
              throw new IllegalArgumentException("Unknown enum value :"+ value);
         }
     }
}   
Run Code Online (Sandbox Code Playgroud)

如果你的'价值'与枚举序数不同,那么这一切都会崩溃.


lcg*_*ida 25

您可以创建一个查找方法.不是最有效的(取决于枚举的大小),但它的工作原理.

public static String getNameByCode(int code){
  for(RelationActiveEnum e : RelationActiveEnum.values()){
    if(code == e.value) return e.name();
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

RelationActiveEnum.getNameByCode(3);
Run Code Online (Sandbox Code Playgroud)

  • 投赞成票是因为枚举中的位置并不总是“RelationActiveEnum.values()[value]”表示它的值。 (2认同)
  • 这可能有性能问题,所以我推荐这个**[选项](http://stackoverflow.com/a/11047810/3444057)** (2认同)

Pet*_*rey 8

你能做的是

RelationActiveEnum ae = Enum.valueOf(RelationActiveEnum.class,
                                     RelationActiveEnum.ACTIVE.name();
Run Code Online (Sandbox Code Playgroud)

要么

RelationActiveEnum ae = RelationActiveEnum.valueOf(
                                     RelationActiveEnum.ACTIVE.name();
Run Code Online (Sandbox Code Playgroud)

要么

// not recommended as the ordinal might not match the value
RelationActiveEnum ae = RelationActiveEnum.values()[
                                     RelationActiveEnum.ACTIVE.value];
Run Code Online (Sandbox Code Playgroud)

如果您想要通过枚举字段进行查找,则需要构建一个集合,例如List,数组或Map.

public enum RelationActiveEnum {
    Invited(0),
    Active(1),
    Suspended(2);

    private final int code;

    private RelationActiveEnum(final int code) {
        this.code = code;
    }

    private static final Map<Integer, RelationActiveEnum> BY_CODE_MAP = new LinkedHashMap<>();
    static {
        for (RelationActiveEnum rae : RelationActiveEnum.values()) {
            BY_CODE_MAP.put(rae.code, rae);
        }
    }

    public static RelationActiveEnum forCode(int code) {
        return BY_CODE_MAP.get(code);
    }
}
Run Code Online (Sandbox Code Playgroud)

允许你写

String name = RelationActiveEnum.forCode(RelationActiveEnum.ACTIVE.code).name();
Run Code Online (Sandbox Code Playgroud)


Mit*_*tri 6

在我的情况下,值不是整数而是字符串.可以将getNameByCode方法添加到枚举中以获取String值的名称 -

enum CODE {
    SUCCESS("SCS"), DELETE("DEL");

    private String status;

    /**
     * @return the status
     */
    public String getStatus() {
        return status;
    }

    /**
     * @param status
     *            the status to set
     */
    public void setStatus(String status) {
        this.status = status;
    }

    private CODE(String status) {
        this.status = status;
    }

    public static String getNameByCode(String code) {
        for (int i = 0; i < CODE.values().length; i++) {
            if (code.equals(CODE.values()[i].status))
                return CODE.values()[i].name();
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)