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中的规范示例,请参阅