JAVA:将字符串解析为静态最终int值
我有一个简单的问题,但我不能解决它。我有这个界面JAVA:将字符串解析为静态最终int值,java,parsing,Java,Parsing,我有一个简单的问题,但我不能解决它。我有这个界面 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) { } 我想将inp
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静态最终int值。这样我就可以打电话给
doSomething(KeyInput.parse(inputString));
我知道的枚举值,但在这里不起作用…如果只有这两个(或任何其他固定数量的)值,您可以在
开关中枚举它们:
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");
}
在这里,您只需按照您的建议执行valueOf
:
public static int parse(String input) {
return Keys.valueOf(input).getValue();
}
如果所有这些选项现在都适用于您的情况,那么您应该使用反射(尽管,我很确定,情况并非如此):
这里需要反射——或者枚举。不管怎么说,这看起来像一个XY问题,那么你想做什么?你真的不知道你想做什么。“将inputString变量解析为KeyInput静态最终int值”是毫无意义的。这个例子很清楚,你至少知道你想要的结果是什么样的。你到底想做什么?我正在从文本文件中读取一些用户定义的值,我需要将这些值转换为KeyInput界面中描述的静态最终int值。KeyInput不是我的界面,因此其他人可以更改它。感谢您的所有建议和广泛总结;)我还喜欢KeyInput.class.getDeclaredFields();方法。
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");
}