用Java编程实现短路评估

用Java编程实现短路评估,java,short-circuiting,Java,Short Circuiting,依赖短路评估是否会使代码变得脆弱? 我写了一段代码,基本上如下所示。我的教授要我重写它 (注意:我确信这四个条件中只有一个是真的,因为给定任何流,只有一个“下一个令牌”,对吗?) 这真的很脆弱吗?我发现它工作得很好。但是我应该如何重写它呢?您在if语句内部初始化您的Bar对象,尝试在if语句外部初始化它。您在if语句内部初始化您的Bar对象,尝试在if语句外部初始化它。问题不仅仅在于短路。短路加上副作用可能是目标。人们普遍反对它,因为它使代码更难理解,更容易破坏。在您的情况下,它稍微不那么繁重,

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

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


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

您在if语句内部初始化您的Bar对象,尝试在if语句外部初始化它。

您在if语句内部初始化您的Bar对象,尝试在if语句外部初始化它。

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

if ((b && c++ > 1) || (c++ < 10)) { ... }
<代码>((b & & C++>1)>(C+++10)){}
在这样的情况下,谁可能知道c发生了什么?

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

if ((b && c++ > 1) || (c++ < 10)) { ... }
<代码>((b & & C++>1)>(C+++10)){}
在这样的情况下,谁能跟踪
c
发生了什么呢?

我会重构它,然后这样写:

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

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

我会重构它,然后这样写:

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

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

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


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

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


具有多个副作用,特别是对同一变量的多个赋值,可能会降低代码的可读性,在JLS中不鼓励使用。

如果它按预期工作,处理边界情况,易于理解,易于扩展,那么它就是好代码。“良好实践”将帮助你达到目标,但重要的是我制定的标准。你能提供peekAndGet方法吗?我认为在同一条线上做作业和比较是很糟糕的。。。但那只是我(和许多其他人)。@jahroy它也是。。。从流中读取时要使用的构造。我也喜欢C#的
return\u foo??(_foo=InitFoo())惰性初始化构造。(尽管这是因为缺少一个
?=
操作符。)@millimoose-你是说它是正确的构造还是最流行的构造?我一直认为它是使用Java的一次性C程序员使用的东西。如果它能按预期工作,处理边界情况,易于理解,易于扩展,那么它就是好代码。“良好实践”将帮助你达到目标,但重要的是我制定的标准。你能提供peekAndGet方法吗?我认为在同一条线上做作业和比较是很糟糕的。。。但那只是我(和许多其他人)。@jahroy它也是。。。从流中读取时要使用的构造。我也喜欢C#的
return\u foo??(_foo=InitFoo())惰性初始化构造。(尽管这是因为缺少一个
?=
操作符。)@millimoose-你是说它是正确的构造还是最流行的构造?我一直认为这是使用Java的一次性C程序员使用的东西。我不能这么做。我应该如何初始化它?我不能那样做。我该怎么初始化呢?哈,看起来真不错,谢谢!(Strage我从来没有想到过……也许是这样,但我自动拒绝了它,因为我总是认为循环会增加很多开销)@onetwother这是微观优化,可能不一定有必要。(即使在解析时,您以后也可能会花费更多的时间进行更高级别的语义分析。)而且据您所知,JVM JIT能够展开此循环以为您进行优化。哈,这看起来确实不错,谢谢!(Strage我从来没有想到过……也许是这样,但我自动拒绝了它,因为我总是认为循环会增加很多开销)@onetwother这是微观优化,可能不一定有必要。(即使在解析时,您以后也可能会花费更多的时间进行更高级别的语义分析。)而且据您所知,JVM JIT能够展开这个循环,为您进行优化。