java - 我如何用一个为每种情况引用一个变量的列表替换 Java 中的开关?

标签 java c++ arrays hash switch-statement

我在这里找不到这样的先前问题(这让我感到惊讶),所以..

我有一个工作的 Java 程序,其中一部分分析键入的输入。一些输入“选项”是以下情况中的字符串。

switch (varName.toLowerCase())  {
    case "steps":
        common.steps = true;
        break;
    case "scale":
        common.scale = true;
        break;
    case "float":
        common.fracts = false;
        break;
    case "fraction":
        common.fracts = true;
        break;
    case "spaces":
        common.spaces = false;
        break;
    ... etc.
}

在 C 或 C++ 中,我可以通过创建一个列表(这是一个包含字符串名称和变量指针的结构)来缩短这段代码,例如

LIST varAction[] = { { "steps", &common.steps },
                     { "scale", &common.scale },
                     .. etc.
                   };

然后简单地检查一个 i = 0 到列表大小的循环

if ( strcmp(varAction[i].name, input) == 0)  {
    *varAction[i].pointer = condition;
}

Java switch出现不止一次,属于维护问题,这就是为什么我想要一个更好的方法。

我可以使用字符串的哈希在数组中使用哈希索引,但这会阻止我根据需要通过代码使用特定的变量名称,从而使代码不那么清晰......即我不想要做(伪代码)

hashTable[varName] instead of (for example)  

if ( common.fracts )
     { do something }

一定有更好的办法吧?在那儿?提前致谢。

最佳答案

从你的问题来看,很明显你知道你不能做你所说的在 C/C++ 中做的事情,但只是为了其他人提出这个问题:Java 没有对变量的引用。

将问题推到一个层次是很诱人的:首先看看为什么你有 varName,看看你是否可以避免它。

The Java switch occurs more than once and is a maintenance problem, which is why I want a better way.

这表明 common 应该具有访问此信息的函数,因此开关仅存在于一个地方(getter)或两个地方(getter 和 setter)。

void setThingy(String name, boolean value) {
    switch (name.toLowerCase())  {
        case "steps":
            this.steps = value;
            break;
        case "scale":
            this.scale = value;
            break;
        case "float":
            this.fracts = value;
            break;
        case "fraction":
            this.fracts = value;
            break;
        case "spaces":
            this.spaces = value;
            break;
        // ... etc.
    }
}

boolean getThingy(String name) {
    switch (name.toLowerCase())  {
        case "steps":
            return common.steps;
        case "scale":
            return common.scale;
        case "float":
            return this.fracts;
        case "fraction":
            return this.fracts;
        case "spaces":
            return this.spaces;
        // ... etc.
    }
}

如果 common 的类不是您可以更改的东西,那么某个地方的静态实用函数也可以工作,但如果可能的话,最好是在类中。

关于java - 我如何用一个为每种情况引用一个变量的列表替换 Java 中的开关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317414/

相关文章:

java - AudioManager 不工作 - 既不打开扬声器也不静音

c++ - 现在允许重新定义 constexpr 静态数据成员吗? (但不是内联常量)?

c# - 将整个 bool[] 设置为 false

java - 在异步执行时停止函数链执行的最佳实践是什么?

java - 在总是抛出方法之后如何检测死代码?

java - Android C++ NDK 示例未更新

c++ - 模棱两可的运行时错误,导致程序立即崩溃

c++ - 为什么我有条件地包含 stdafx.h 后会出现编译错误?

ios - 将 4 个不同数组的内容按相同顺序排序

javascript - 如何使用 Ramda remove 从对象数组中删除空对象?