java - 如何在Java中重构大量的if语句?

标签 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;


有没有更好的方式编写这些if语句,还是应该在其他地方提高效率?

编辑:该程序使用进化科学来发展达到给定结果的途径。具体而言,为《星际争霸II》建立订单。此方法检查特定演化是否满足给定结果的条件。

最佳答案

首先,您使用&而不是&&,所以您没有利用短路评估的优势。也就是说,&运算符将要求同时评估&双方的两个条件。如果您确实在进行按位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));


其次,您想尝试将最有可能满足条件的条件移到表达式链的顶部,这样可以节省对其余表达式的求值。例如,如果c1.var4
缺少这些,在这种方法上花费大量的时间似乎有点奇怪,除非这些情况影响了数据库或类似的事情。

关于java - 如何在Java中重构大量的if语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011104/

相关文章:

java - 对于 Java 赋值 "x=y",Java 编译器是否要求 x 声明的类型是 y 的父类(super class)型(包括相同类型)?

R 语言感知代码重新格式化/重构工具?

java - 有没有办法消除 Java 中早期方法返回的冗余检查?

if-statement - 多行相关下拉菜单

java - 使用关联消息进行与旧服务器的 TcpOutboundGateway 连接的正确方法是什么

java - 如何检查智能卡上是否有小程序

asp.net-mvc - 使用 Ninject 重构依赖注入(inject)的 ASP.NET MVC 代码的真实示例

java - 有没有更好的方法来编写与我相同的代码?

java - if 语句 undefined variable

java - hamcrest 中的严格匹配?