Hiii。所以,我有这些很长的switch-case,我有这些代码:可能的重构?长时间重复的代码行java
case 34:
if(cToken.getName() == TokenName.PROG_NAME.toString()
|| cToken.getName() == "DEDENT"
|| cToken.getName() == TokenName.ASSIGN.toString()
|| cToken.getName() == TokenName.PROC_CALL.toString()
|| cToken.getName() == TokenName.BREAK.toString()
|| cToken.getName() == TokenName.CONTINUE.toString()
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString()
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString()
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString()
|| cToken.getName() == TokenName.DATATYPE_INT.toString()
|| cToken.getName() == TokenName.DATATYPE_STRING.toString()
|| cToken.getName() == TokenName.DATATYPE_VOID.toString()
|| cToken.getName() == TokenName.INPUT.toString()
|| cToken.getName() == TokenName.OUTPUT.toString()
|| cToken.getName() == TokenName.IF.toString()
|| cToken.getName() == TokenName.DO.toString()
|| cToken.getName() == TokenName.WHILE.toString()
|| cToken.getName() == TokenName.INC_OP.toString()
|| cToken.getName() == TokenName.DEC_OP.toString()){
reduce(51);
} else {
error();
} break;
case 35:
if(cToken.getName() == TokenName.PROG_NAME.toString()
|| cToken.getName() == "DEDENT"
|| cToken.getName() == TokenName.ASSIGN.toString()
|| cToken.getName() == TokenName.PROC_CALL.toString()
|| cToken.getName() == TokenName.BREAK.toString()
|| cToken.getName() == TokenName.CONTINUE.toString()
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString()
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString()
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString()
|| cToken.getName() == TokenName.DATATYPE_INT.toString()
|| cToken.getName() == TokenName.DATATYPE_STRING.toString()
|| cToken.getName() == TokenName.DATATYPE_VOID.toString()
|| cToken.getName() == TokenName.INPUT.toString()
|| cToken.getName() == TokenName.OUTPUT.toString()
|| cToken.getName() == TokenName.IF.toString()
|| cToken.getName() == TokenName.DO.toString()
|| cToken.getName() == TokenName.WHILE.toString()
|| cToken.getName() == TokenName.INC_OP.toString()
|| cToken.getName() == TokenName.DEC_OP.toString()){
reduce(52);
} else {
error();
} break;
好吧,这只是两个我的情况。我只是想知道是否有一种方法可以让我/可以使用这个长表达式的快捷方式(重复),但是因为我在不同的情况下使用它们,不同的是 - 要做 - (如果它通过'if'测试例如(案例34,调用减少方法以51作为输入和情况35,调用减少方法与52作为输入)
基本上,我阿斯金是,如果有一种方法,我可以喜欢把
cToken.getName() == TokenName.PROG_NAME.toString()
|| cToken.getName() == "DEDENT"
|| cToken.getName() == TokenName.ASSIGN.toString()
|| cToken.getName() == TokenName.PROC_CALL.toString()
|| cToken.getName() == TokenName.BREAK.toString()
|| cToken.getName() == TokenName.CONTINUE.toString()
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString()
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString()
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString()
|| cToken.getName() == TokenName.DATATYPE_INT.toString()
|| cToken.getName() == TokenName.DATATYPE_STRING.toString()
|| cToken.getName() == TokenName.DATATYPE_VOID.toString()
|| cToken.getName() == TokenName.INPUT.toString()
|| cToken.getName() == TokenName.OUTPUT.toString()
|| cToken.getName() == TokenName.IF.toString()
|| cToken.getName() == TokenName.DO.toString()
|| cToken.getName() == TokenName.WHILE.toString()
|| cToken.getName() == TokenName.INC_OP.toString()
|| cToken.getName() == TokenName.DEC_OP.toString()
到一个变量或一些占位符,然后在if子句中使用该变量,以便长代码块只出现一次,然后我只是要使用包含该变量的变量?
对不起,如果我不能更好地解释..谢谢!
不要使用'=='或'!='比较字符串。改为使用“equals(...)”或“equalsIgnoreCase(...)”方法。理解'=='检查两个*对象引用*是否相同,而不是你感兴趣的。另一方面,方法检查两个字符串是否具有相同顺序的相同字符,这就是这里很重要。 – 2015-04-03 19:36:45
哦,对。谢谢你的提示!我会立即修复它们:) – kimsanity 2015-04-03 19:38:34
似乎你应该在'if'条件下有'switch-case',而不是相反。另外,在'switch'中有35个case不是个好主意。尝试设计一种方法,用几行代码将它们集中在一起(这几乎总是可行的)。 – 2015-04-03 19:42:03