我在这里找不到这样的先前问题(这让我感到惊讶),所以..
我有一个工作的 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/