Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 括号应该总是放在三元运算符的周围吗?_Java_Ternary Operator - Fatal编程技术网

Java 括号应该总是放在三元运算符的周围吗?

Java 括号应该总是放在三元运算符的周围吗?,java,ternary-operator,Java,Ternary Operator,Checkstyle抱怨以下问题: return (null == a ? a : new A()); 并且说帕伦夫妇是不必要的 虽然没有它们,这句话当然可以很好地表达出来,但有了它们,这句话看起来更具可读性——否则,当我阅读它时,我倾向于看到: return null 首先要停下来考虑剩余的 == a ? a : new A(); 部分,因为我的大脑已经走了一条路 此外,每当我看到一个三元运算符时,我倾向于做同样的事情,除非它分组在paren中 那么:围绕三元的帕伦斯应该是事实上的标准

Checkstyle抱怨以下问题:

return (null == a ? a : new A());
并且说帕伦夫妇是不必要的

虽然没有它们,这句话当然可以很好地表达出来,但有了它们,这句话看起来更具可读性——否则,当我阅读它时,我倾向于看到:

return null

首先要停下来考虑剩余的

== a ? a : new A(); 
部分,因为我的大脑已经走了一条路

此外,每当我看到一个三元运算符时,我倾向于做同样的事情,除非它分组在paren中


那么:围绕三元的帕伦斯应该是事实上的标准吗?是否有任何理由不把它们放在那里?

这两个选项都是正确的,如果您单独工作,请使用您的团队使用的工具或您喜欢的工具。


IIRC默认情况下,checkstyle使用Sun(r.i.p)的样式指导原则,因此如果您想符合标准样式,请听一听并删除参数。

好吧,checkstyle是正确的,括号对于执行是无用的。但是对执行无用并不意味着对代码的良好阅读无用。如果读起来更有意义的话,你应该把它们留下

我认为这段代码不需要更多的括号:

int number = (myBoolean)? 1 : 2;

但是在您的情况下,
return
关键字和布尔值是表达式的事实可能会改变您阅读语句的方式。

不,它不应该是事实上的标准。我更喜欢没有帕伦斯的


我认为把它们放在那里的唯一原因是为了强制执行评估顺序或澄清一条令人困惑的线。

既然你的问题的基础与阅读代码的行为有关,我将从这个角度来处理这个问题

所谓的“快速阅读”训练计划的基本原则之一是,他们试图让读者形成一行文本的格式塔,而不是逐字逐句地顺序阅读。你可以试着从他们的书中拿出一页,然后从你的代码中退一步——如果需要的话,从字面上看——来理解整行内容,而不是把阅读的行为当作一个标记一个标记地解析


或者,您可以使用一个编辑器来配置样式:您可以将三元运算符设置为不同的颜色,以便它跳转到您的面前。例如,记事本++和其他许多编辑器一样,都有许多内置的主题来实现这一点。

阅读return语句时,我知道“return”和“;”之间的所有内容是将要返回的内容,所以我无法将您的代码示例读取为returnnull,后跟一些符号,正如您声称已读取的那样

也许阅读解析技术可以帮助你像我一样了解它。也就是说,我还没有真正阅读过解析技术,尽管多年来我拼凑了一些解析器

我总是删除不必要的括号。它们对代码理解没有帮助,因为我非常了解Java的运算符优先级。偶尔我不确定,我会加上括号,然后等着看IDEA是否告诉我它们是多余的。然后我删除它们,并尝试将我刚刚发现的优先规则提交给内存


在我继承的代码库中,我倾向于在由于其他原因而不好的代码区域中找到最多的冗余括号,因此我将这两者联系起来。

一般来说,

三元(也称为条件)运算符或其部分不需要括号,因为它们在运算顺序中的优先级非常低(仅低于逻辑运算符,高于赋值)。有关完整的表格,请参见下面的链接

因此,可以说,这些不必要的参数在视觉上会使代码变得混乱,这表明程序员缺乏理解

可能需要在ternaries内或周围使用Paren的例外情况如下:

  • 如果你的三元数足够复杂,可以有多行;然后可以将语句用括号括起来,以防止自动插入分号

  • 如果您的三元嵌套在另一个三元中

另请参见MDN:


为什么在示例代码中使用paren?这与被问及的模式不同。我也更喜欢这种语法。这似乎使阅读和识别条件变得更容易。对我来说,使用parens也更容易阅读。我有一个例子,比如var thing=something.prop1.method2()?x:y。读到这篇文章,我首先想到了一些东西。prop1.method2将是初始化我的变量的东西。如果有parens。。。我会怀疑使用了三元运算符。