【问题标题】:Using Java's ternary operator, what's the implication of assigning a variable to itself?使用Java的三元运算符,将变量分配给自身意味着什么?
【发布时间】:2016-11-07 19:09:06
【问题描述】:

我过度使用三元运算符,有时甚至用它替换非常简单的 if 语句。例如,我刚刚发现自己替换了这样的东西:

if (foo != null) {
    bar = foo;
}

用这个:

bar = (foo == null) ? bar : foo;

虽然哪个读起来更好看是一个品味问题,但我想知道:

  • 在这种情况下,三元版本的性能是否更差?
  • 还有什么其他理由反对在这里使用三元吗?

我认为这里的性能可能会更差的原因是,我假设编译器无法针对 foonull 时优化三进制。因此,bar 的值可能会再次设置为相同的值,从而浪费一些 CPU 时间,而简单的if 语句将永远无法达到这一点。但我对编译器和执行的知识有限,因此提出了这个问题。

【问题讨论】:

  • 在某些条件下“崩溃”为bar = bar 的想法对我来说很奇怪。前者(带有if 语句)更冗长,但更具可读性和清晰性。我的 0.02 美元
  • 您已经回答了自己的问题。这是三元运算符的“开销”和不方便的使用。
  • 创建一个无所事事的自分配是代码异味。三元运算符旨在减少 if-else 赋值的膨胀。如果没有别的,就真的不需要用了。
  • 有点切题,担心这两个语句之间的编译/运行时间差异可能比它的价值更麻烦。我认为确保您的代码在其操作中完全一致比担心几微秒的操作更有趣。例如,有人会想“为什么甜蜜的圣诞节在这里有一个三元运算”?如果是这样,可能使用标准成语。在大多数情况下,开发人员时间的秒数 > 处理时间的微秒。
  • 是的...我自己也过度使用了三元运算符(通常是嵌套的、多行的东西),但这对我来说仍然很奇怪。对我来说,优点是编译器检查保证在任何分支中都返回一个值,并且它让我能够区分“功能性”构造和“命令式”构造。不过,我没有看到你这样做……也许你在最初分配给bar 时使用了它,而不是?

标签: java performance variables variable-assignment ternary


【解决方案1】:

如果你担心风格,你至少应该去除括号噪音:

bar = foo == null ? bar : foo;

至于性能,在foo 为空的情况下,您有一个不必要的分配。大不了。你说的是纳秒。

不要担心“性能”的这种微不足道的差异。担心可读性,这更重要。

在这种情况下,我发现if 版本更具可读性:

if (foo != null) {
    bar = foo;
}

很清楚代码的意图是什么。

【讨论】:

  • 想一想,让我选择三进制的一个原因是我更喜欢foo == null 而不是foo != null。另外,我同意在大多数情况下,性能差异并不重要。只是想确定一下。我不同意的是无括号三元:我发现使用括号更容易阅读。但这当然是品味和习惯的问题。顺便说一句,我将我的代码更改为 if 版本,因为我同意它最容易阅读(并且现在确信三进制可能会增加一些纳秒)。
  • @domdom 关于 foo == nullfoo != null,总是更喜欢 positive 测试(即等于、大于等)而不是 negative 测试(不等于、不大于等)如果可以的话,因为它们更容易让我们微小的人类大脑阅读和理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2023-03-26
  • 2016-09-26
  • 2021-06-22
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多