繁体   English   中英

Java中使用短路评估进行编程

[英]programming with short-circuit evaluation in Java

依靠短路评估会使代码变得脆弱吗? 我写了一段代码,基本上看起来像下面的代码。 我的教授要我重写它。

(注意:我确定四个条件中只有一个是正确的,因为给定任何流,只有一个“下一个令牌”,对吧?)

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;
}

这真的很脆弱吗? 我发现它工作正常。 但是我应该如何重写呢?

我将其重构并这样写:

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

注意:这样做的一个很好的理由是,当我第一次阅读您的代码时,我以为它看起来像是有问题的,直到我阅读您的问题。 您想保留那些“有些不对劲”的时刻来处理真正错误的事情。

您正在if语句内初始化Bar对象,请尝试在if语句外对其进行初始化。

问题不仅仅在于短路。 短路加上可能是目标的副作用。 人们之所以对此表示反对,是因为它使代码更难于理解且更容易破解。 就您而言,它的繁琐程度有所减轻,但请看以下示例:

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

在这样的情况下,谁可能跟踪c的情况?

代码一点也不脆弱。 它的行为完全由Java语言规范指定,并且可以满足我的预期。

具有多个副作用,尤其是对同一变量的多个赋值,可能会使代码的可读性降低,并且在JLS中不建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM