用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;
}
这真的很脆弱吗?我发现它工作得很好。但是我该怎么重写呢
# 1 楼答案
问题不仅仅在于短路。短路加上副作用可能是目标。人们普遍反对它,因为它使代码更难理解,更容易破坏。在您的情况下,它稍微不那么繁重,但以以下示例为例:
在这样的情况下,谁可能知道
c
发生了什么# 2 楼答案
代码一点也不脆弱。它的行为完全由Java语言规范指定,并且实现了我认为您想要的
具有多个副作用,特别是对同一变量的多个赋值,会降低代码的可读性,JLS不鼓励这样做
# 3 楼答案
如果要在if语句内部初始化Bar对象,请尝试在if语句外部初始化它
# 4 楼答案
我会重构它,并这样写:
注意:这样做的一个很好的理由是,在我第一次阅读你的代码时,我认为它看起来有问题,直到我阅读了你的问题。你想把那些“看起来不对劲”的时刻留给真正不对劲的事情