2

依赖短路评估会使代码脆弱吗?我写了一段代码,基本上如下所示。我的教授要我重写它。

(注意:我确信这四个条件中只有一个为真,因为给定任何流,只有一个“下一个令牌”,对吗?)

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

4 回答 4

7

我会重构它并这样写:

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

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

于 2013-03-13T03:10:46.533 回答
1

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

于 2013-03-13T03:01:10.687 回答
1

问题不仅仅在于短路。它可能是目标的短路和副作用。它被广泛反对,因为它使代码更难理解和更容易破解。就您而言,它的繁重程度要小一些,但请看以下示例:

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

在这样的情况下,谁能跟踪发生了什么c

于 2013-03-13T03:08:00.383 回答
1

代码一点也不脆弱。它的行为完全由 Java 语言规范指定,并且按照我认为您的意图进行。

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

于 2013-03-13T03:15:04.507 回答