JAVA:将String解析为静态final int值

时间:2014-11-06 11:18:35

标签: 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) { 
}

我想将inputString变量解析为KeyInput static final int值。所以我可以打电话....

doSomething(KeyInput.parse(inputString));

我知道enum valueOf,但这在这里不起作用......

1 个答案:

答案 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");
}