我有一个简单的问题,但我无法修复它。我有这个界面......
public interface KeyInput extends Input {
public static final int TEST1 = 0x01;
public static final int TEST2 = 0x02;
}
...这个字符串变量......
String inputString = "TEST1";
......和这种方法。
public void doSomething(int _input) {
}
我想将inputString变量解析为KeyInput static final int值。所以我可以打电话....
doSomething(KeyInput.parse(inputString));
我知道enum valueOf,但这在这里不起作用......
答案 0 :(得分:1)
如果您只有这两个(或任何其他固定数量)的值,您可以在switch
中枚举它们:
public static int parse(String input) {
int res = -1;
switch (input) {
"TEST1":
res = TEST1;
break;
"TEST2":
res = TEST2;
break;
// ... other options
default: throw new IllegalArgumentException("unknown string");
}
}
另一个选项是将此值保留在某个地图中,因此您可以执行此操作:
private static final Map <String, Integer> TESTS = new HashMap<>();
static {
TESTS.put("TEST1", 0x01);
TESTS.put("TEST2", 0x02);
// ...
}
public static int parse(String input) {
if (TESTS.containsKey(input))
return TESTS.get(input);
else
throw new IllegalArgumentException("unknown string");
}
尽管如此,如果您将枚举视为一种选择,我可以考虑这个解决方案:
public enum Keys {
TEST1(0x01), TEST2(0x02);
int value;
private Keys(int value) {
this.value = value;
}
public getValue() {
return value;
}
}
在这里,您只需按照您的建议valueOf
进行操作:
public static int parse(String input) {
return Keys.valueOf(input).getValue();
}
如果现在所有这些选项适用于您的情况,您应该使用反射(但是,我很确定,情况并非如此):
public static int parse(String input) {
Field[] fields = KeyInput.class.getDeclaredFields();
for (Field field : fields) {
if (Modifier.isStatic(fields.getModifiers()) && field.getDeclaringClass().equals(int.class) && field.getName().equals(input)) {
return field.getInt(null);
}
}
throw new IllegalArgumentException("unknown string");
}