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