我已经定义了这个枚举,客户端可以在其中传递一些随机类型,我想将它们转换为一致的可用形式:
package com.amazon.dvpatemplateselectionservice.types;
public enum Cases {
LOWERCASE("lowercase"), UPPERCASE("UPPERCASE"), CAMEL("camelCased");
private final String someCase;
Cases(final String inputCase) {
this.someCase = inputCase;
}
}
当我在代码中调用此代码时,我希望来自客户端的输入转换为枚举:
Cases whatever = Cases.valueOf(Cases.class, requestParams.getValue());
Class someClass = new Class(whatever);
我得到的错误:
java.lang.IllegalArgumentException: camelCased is not a constant in Cases
我在这里想念什么?
答案 0 :(得分:1)
name
的{{1}}参数要求枚举名称完全与声明的名称相同,并且不能与您的输入一起使用。
您将需要使用以下自定义查找方法,例如Enum#valueOf
:
find
并像这样使用它:
enum Cases {
LOWERCASE("lowercase"), UPPERCASE("UPPERCASE"), CAMEL("camelCased");
private final String caze;
Cases(final String inputCase) {
this.caze = inputCase;
}
public static Cases find(String c) {
//you can also just loop
return Stream.of(values()).filter(v -> v.caze.equals(c))
.findFirst().orElse(null);
}
}
答案 1 :(得分:1)
Cases whatever = Cases.find(requestParams.getValue());
正在寻找枚举项的常量名称。例如,Cases.valueOf(String)
,LOWERCASE
和UPPERCASE
。
如果要从字段中查找枚举项,请编写一种方法来实现。
CAMEL
答案 2 :(得分:0)
public static Cases fromString(String string) {
return Arrays.stream(Cases.values())
.filter(x -> x.someCase.equals(string))
.findAny()
.orElseThrow(() -> new IllegalArgumentException("No such case: "+string));
}
尝试使用给定的Enum.valueOf(Class<T> enumType, String name)
(see Enum.valueOf javadoc)创建类型为enumType
的枚举。
因此,您必须构造一个自定义查找方法,该方法将在您称为name
的字段上使用以构造Cases类型的枚举。
答案 3 :(得分:0)
在您的case
中添加此方法(我将enum
重命名为case
,因为_case
是禁止的Java关键字):
case
然后:
public static Cases fromLabel(String label)
{
return Stream.of(Cases.values())
.filter(c -> c._case.equals(label))
.findFirst().orElse(null);
}