Java 如何将值映射回枚举?

Java 如何将值映射回枚举?,java,enums,guava,Java,Enums,Guava,给定一个枚举,其中每个实例都与某个值关联: public enum SQLState { SUCCESSFUL_COMPLETION("00000"), WARNING("01000"); private final String code; SQLState(String code) { this.code = code; } } 如何构建地图以实现高效的反向查找?我尝试了以下方法: public enum SQLState { SUCCESSFUL_C

给定一个枚举,其中每个实例都与某个值关联:

public enum SQLState
{
  SUCCESSFUL_COMPLETION("00000"),
  WARNING("01000");

  private final String code;
  SQLState(String code)
  {
    this.code = code;
  }
}
如何构建地图以实现高效的反向查找?我尝试了以下方法:

public enum SQLState
{
  SUCCESSFUL_COMPLETION("00000"),
  WARNING("01000");

  private final String code;
  private static final Map<String, SQLState> codeToValue = Maps.newHashMap();
  SQLState(String code)
  {
    this.code = code;
    codeToValue.put(code, this); // problematic line
  }
}
公共枚举SQLState
{
成功完工(“00000”),
警告(“01000”);
私有最终字符串代码;
私有静态最终映射codeToValue=Maps.newHashMap();
SQLState(字符串代码)
{
this.code=代码;
codeToValue.put(代码,此);//有问题的行
}
}
但Java抱怨:
从初始值设定项非法引用静态字段。也就是说,静态映射是在所有枚举值之后初始化的,因此您不能从构造函数引用它。有什么想法吗?

使用:

static {
  for (SQLState sqlState : values()){
     codeToValue.put(sqlState.code, sqlState);
  }
}

在构造函数之前初始化静态{…}块中的静态映射。查找静态初始值设定项块。

使用Guava时,我建议使用以下代码:

public enum SQLState {

    SUCCESSFUL_COMPLETION("00000"),
    WARNING("01000"),
    ;

    private final String code;
    private SQLState(String code) {
        this.code = code;
    }

    public static final Function<SQLState,String> EXTRACT_CODE = new Function<SQLState,String>() {
        @Override
        public String apply(SQLState input) {
            return input.code;
        }
    };

    public static final Map<String, SQLState> CODE_TO_VALUE = ImmutableMap.copyOf( Maps.uniqueIndex(EnumSet.allOf(SQLState.class), EXTRACT_CODE) );

    public static void main(String[] args) {
        System.out.println( SQLState.CODE_TO_VALUE.get("00000") );
    }

}
公共枚举SQLState{
成功完工(“00000”),
警告(“01000”),
;
私有最终字符串代码;
私有SQLState(字符串代码){
this.code=代码;
}
公共静态最终函数EXTRACT_CODE=新函数(){
@凌驾
公共字符串应用(SQLState输入){
返回input.code;
}
};
public static final Map CODE_TO_VALUE=ImmutableMap.copyOf(Maps.uniqueIndex(EnumSet.allOf(SQLState.class),EXTRACT_CODE));
公共静态void main(字符串[]args){
System.out.println(SQLState.CODE_TO_VALUE.get(“00000”);
}
}
这将产生预期的结果:“成功完成”

当您不能内联初始化最终变量时,使用静态初始值设定项是很好的,但是在本例中,使用Guava,您确实可以使用Functional方法使用Guava函数

此外,您可以同时使列表不可变,如果您需要公开它,这很好

您还可以使用静态块使列表不可变,但需要在初始化最终列表之前填充临时列表


检查 这是番石榴的一个非常酷的函数,它允许通过任何属性对任何对象进行索引。
如果许多对象共享相同的属性值,则可以使用Multimaps.index,对于每个键,它将为您提供具有此属性的对象列表。

有关JLS中的规范示例,请参阅