可能的重构?长重复代码行 java

possible refactor? long repeating lines of codes 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;

好的,这只是我遇到的两个案例。我只是想知道是否有一种方法可以 make/use 那个长表达式(重复)的快捷方式但是因为我在不同的情况下使用它们,有不同的 -to-do- (如果它通过 'if' 测试例如(案例 34,以 51 作为输入调用 reduce 方法,案例 35,以 52 作为输入调用 reduce 方法)

基本上,我想问的是是否有一种方法可以放置

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 子句中使用该变量,这样长代码块只出现一次,然后我就使用包含它的变量?

抱歉,如果我不能解释得更好..谢谢!

考虑将您的字符串放入 ArrayList 或 HashSet 等集合中,然后通过 contains(String) 方法查看集合中是否包含感兴趣的字符串。

附带建议,不要使用 ==!= 比较字符串。请改用 equals(...)equalsIgnoreCase(...) 方法。了解 == 检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否相同字符顺序相同,这就是这里的重点。

似乎传递给 reduce 的值比 case 标签多 17。

你可以确保你开启的值在你需要的范围内,然后将value + 17传递给reduce

if (value >= x && value <= y)
{
     if (/* really long conditions here */)
     {
         reduce(value + 17);
     }
}

如果案例标签和传递给 reduce 的值之间没有数学关系(并且 "plus 17" 只是您展示的 2 个案例的巧合),则创建一个Map<Integer, Integer> 个案例标签以减少调用 reduce.

时要使用的值

这将消除为每个案例一遍又一遍地复制长 if 条件的需要。

其次,将 getName() 的所有可能值放入 List<String> 并调用 contains 以查看它是否与其中之一匹配。

     if (listOfValues.contains(cToken.getName()) {

您可以创建一个包含可接受标记的列表

List<String> tokens = Arrays.asList(TokenName.PROG_NAME.toString(), "DECENT", ...);

然后检查

tokens.contains(cToken.getName())

你能给你的 TokenName class 添加一个方法 getReductionFactor() 吗?然后打电话

reduce(value + cToken.getReductionFactor());

并完成它。