有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这真的很脆弱吗?我发现它工作得很好。但是我该怎么重写呢


共 (4) 个答案

  1. # 1 楼答案

    问题不仅仅在于短路。短路加上副作用可能是目标。人们普遍反对它,因为它使代码更难理解,更容易破坏。在您的情况下,它稍微不那么繁重,但以以下示例为例:

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

    在这样的情况下,谁可能知道c发生了什么

  2. # 2 楼答案

    代码一点也不脆弱。它的行为完全由Java语言规范指定,并且实现了我认为您想要的

    具有多个副作用,特别是对同一变量的多个赋值,会降低代码的可读性,JLS不鼓励这样做

  3. # 3 楼答案

    如果要在if语句内部初始化Bar对象,请尝试在if语句外部初始化它

  4. # 4 楼答案

    我会重构它,并这样写:

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

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