依靠短路评估会使代码变得脆弱吗? 我写了一段代码,基本上如下所示。我的教授要我改写它。
(注意:我肯定知道这四个条件中只有一个是真的,因为给定任何流,只有一个'下一个标记',对吗?)
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;
}
这真的很脆弱吗?我觉得它很完美。但是我应该如何改写呢?
答案 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中不鼓励。