如何在 Java 中重构一大块 if 语句?

DRG*_*DRG 3 java refactoring if-statement decomposition

我最近使用 JVisualVM 分析了一些代码,发现一种特定方法占用了大量执行时间,原因是频繁调用和执行时间缓慢。该方法由一大块 if 语句组成,如下所示:(在实际方法中大约有 30 个)

    EcState c = candidate;

    if (waypoints.size() > 0)
    {
        EcState state = defaultDestination();
        for (EcState s : waypoints)
        {
            state.union(s);
        }
        state.union(this);
        return state.isSatisfied(candidate);
    }

    if (c.var1 < var1)
        return false;
    if (c.var2 < var2)
        return false;
    if (c.var3 < var3)
        return false;
    if (c.var4 < var4)
        return false;
    if ((!c.var5) & var5)
        return false;
    if ((!c.var6) & var6)
        return false;
    if ((!c.var7) & var7)
        return false;
    if ((!c.var8) & var8)
        return false;
    if ((!c.var9) & var9)
        return false;

    return true;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来编写这些 if 语句,或者我应该寻找其他地方来提高效率?

编辑:该计划使用进化科学来开发达到给定结果的路径。具体来说,是《星际争霸 II》的建造订单。该方法检查特定的演化是否满足给定结果的条件。

dcp*_*dcp 5

首先,您使用的&是而不是&&,因此您没有利用短路评估。也就是说,&运算符将要求对 & 两侧的条件进行评估。如果您确实进行按位AND运算,那么这将不适用,但如果不是,请参见下文。

假设如果不满足条件则返回true,你可以像这样重写它(我改为&&&

return 
       !(c.var1 < var1 ||
       c.var2 < var2 ||
       c.var3 < var3 ||
       c.var4 < var4 ||
       ((!c.var5) && var5) ||
       ((!c.var6) && var6) ||
       ((!c.var7) && var7) ||
       ((!c.var8) && var8) ||
       ((!c.var9) && var9));
Run Code Online (Sandbox Code Playgroud)

其次,您想要尝试将最有可能为真的条件移动到表达式链的顶部,这样就可以节省对剩余表达式的求值。例如,if (c1.var4 < var4)99% 的情况下可能都是正确的,您可以将其移至顶部。

除此之外,除非这些条件影响数据库或类似的东西,否则您会在这种方法上花费大量时间,这似乎有点奇怪。