从字符串中按名称获取变量

2022-09-02 03:55:43

示例代码:

int width = 5;
int area = 8;
int potato = 2;
int stackOverflow = -4;

现在,假设我想让用户输入一个字符串:

String input = new Scanner(System.in).nextLine();

然后,说出用户输入。如何检索名为的变量并用它执行操作?像这样:potatopotato

System.getVariable(input); //which will be 2
System.getVariable("stackOverflow"); //should be -4

我查了一些东西,没有找到太多;我确实找到了一个叫做“反射API”的东西,但对于这个简单的任务来说,这似乎太复杂了。

有没有办法做到这一点,如果是这样,它是什么?如果“反射”确实有效,如果这是唯一的方法,那么我将如何使用它来做到这一点?它的教程页面有各种各样的内部内容,我无法理解。

编辑:我需要将s保留在我正在做的事情的变量中。(我不能使用StringMap)


答案 1

使用反射似乎不是一个好的设计,因为你在这里所做的事情。最好使用例如:Map<String, Integer>

static final Map<String, Integer> VALUES_BY_NAME;
static {
    final Map<String, Integer> valuesByName = new HashMap<>();
    valuesByName.put("width", 5);
    valuesByName.put("potato", 2);
    VALUES_BY_NAME = Collections.unmodifiableMap(valuesByName);
}

或者用番石榴

static final ImmutableMap<String, Integer> VALUES_BY_NAME = ImmutableMap.of(
    "width", 5,
    "potato", 2
);

或者使用枚举

enum NameValuePair {

    WIDTH("width", 5),
    POTATO("potato", 2);

    private final String name;
    private final int value;

    private NameValuePair(final String name, final int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    static NameValuePair getByName(final String name) {
        for (final NameValuePair nvp : values()) {
            if (nvp.getName().equals(name)) {
                return nvp;
            }
        }
        throw new IllegalArgumentException("Invalid name: " + name);
    }
}

答案 2

变量名称仅在编译器时可用。反射仅允许访问类声明和其中声明的项,但不能访问局部变量。我怀疑某种类型的解决方案将是解决您真正问题的更合适的解决方案。具体来说,签出和 .MapHashMapTreeMap