Java 按枚举';获取枚举;s构造函数值

Java 按枚举';获取枚举;s构造函数值,java,enums,Java,Enums,在java中,通过枚举的构造函数值获取枚举的正确方法是什么? 下面是一个例子: public enum Status{ CREATED("created"), IN_PROGRESS("inProgress"), COMPLETED("completed"); public final String statusStr; Status(String statusStr){ this.statusStr = statusStr; } } 因此,如果我得到的输入是一个“created”字符串

在java中,通过枚举的构造函数值获取枚举的正确方法是什么? 下面是一个例子:

public enum Status{
CREATED("created"), IN_PROGRESS("inProgress"), COMPLETED("completed");

public final String statusStr;
Status(String statusStr){
  this.statusStr = statusStr;
}
}

因此,如果我得到的输入是一个“created”字符串,那么如何从中获取Status.created

我认为你不能自动完成。您必须为此创建一个静态方法:

公共静态状态fromString(String){
对于(状态:values()){
if(status.statusStr.equals(string)){
返回状态;
}
}
抛出新的IllegalArgumentException(字符串);
}
结合@Pshemo的建议,代码也可以是:

@RequiredArgsConstructor@Getter
公共枚举状态{
已创建(“已创建”)、正在进行(“正在进行”)、已完成(“已完成”);
私有静态最终映射=Arrays.stream(Status.values())
.collect(Collectors.toMap(Status::getStatusStr,Function.identity());
私有最终字符串statusStr;
来自字符串的公共静态状态(字符串){
返回Objects.requirennull(MAP.get(string));
}
}

不是完整的副本,但请查看循环值或构建查找映射考虑使用
valueOf
而不是创建自己的并行字符串查找方法。我认为在这里放弃Java常量的命名约定,使用
created
inProgress
等作为枚举值是明智的。在此之前我给出了以下建议:可能的改进:每次调用
values()
都会创建状态枚举值的新数组,并且这些数组将始终具有相同的状态元素。我们可以调用
values()
一次,并像
private static final Status[]values=values()那样缓存它并在方法中使用
值。我们还可以使用
Map
作为缓存。只需在静态初始化块中填充它,并像
publicstationstatusfromstring(String){returnmap.get(String);}
一样使用它。