使用Java进行短路评估编程

One*_*ree 1 java short-circuiting

是否依赖于短路评估会使代码变得脆弱?我写了一段代码,基本上如下所示.我的教授要我改写它.

(注意:我肯定知道四个条件中只有一个是真的,因为给定任何流,只有一个'下一个标记',对吗?)

foo getFoo()
{
        Bar bar;
        if ((bar = peekAndGet('x')) != null 
                || (bar = peekAndGet('y')) != null 
                || (bar = peekAndGet('z')) != null 
                || (bar = peekAndGet('t')) != null) 
            return produce(bar);
        else 
            return null;
}
Run Code Online (Sandbox Code Playgroud)

这真的很脆弱吗?我觉得它很完美.但是我应该怎么重写呢?

ass*_*ias 7

我会重构它并像这样写:

char[] values = {'x', 'y', 'z', 't'};
for (char c : values) {
    Bar bar = peekAndGet(c);
    if (bar != null) return produce(bar);
}
return null;
Run Code Online (Sandbox Code Playgroud)

注意:这样做的一个很好的理由是,在我第一次阅读你的代码时,我认为它看起来很麻烦,直到我读到你的问题.对于那些真正错误的事情,你想要保留那些"看起来不对劲"的时刻.

  • @OneTwoThree那是微观优化,可能不一定有必要.(即使在解析时,您可能会花更多的时间在以后进行更高级别的语义分析.)而且据您所知,JVM JIT能够展开此循环以针对您进行优化. (2认同)