使用Java进行短路评估编程

时间:2013-03-13 02:47:36

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

这真的很脆弱吗?我觉得它很完美。但是我应该如何改写呢?

4 个答案:

答案 0 :(得分:7)

我会重构它并像这样写:

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

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

答案 1 :(得分:1)

您正在if语句中初始化Bar对象,尝试在if语句之外初始化它。

答案 2 :(得分:1)

这不是短路问题。这是短路加上可能是目标的副作用。它受到了广泛的反对,因为它使代码更难理解,更容易破解。在你的情况下,它有点不那么繁重,但举个例子:

if ((b && c++ > 1) || (c++ < 10)) { ... }

在这种情况下,谁可以跟踪c发生的事情?

答案 3 :(得分:1)

代码并不脆弱。它的行为完全由Java语言规范指定,并按照我的想法行事。

有多个副作用,特别是对同一个变量的多个赋值,可能会使代码的可读性降低,并且在JLS中不鼓励。