Java 逻辑运算中的条件赋值

Java 逻辑运算中的条件赋值,java,coding-style,Java,Coding Style,这种速记是一种不好的做法吗?或者任何具有Java基本知识的程序员都应该知道,如果主机等于“localhost”,则在下面的代码中,checkDoSResult不会被重新分配 您可以选择: int checkDoSResult = 0; if (!"localhost".equals(host) && (checkDoSResult = CheckHost.checkDoS(user+"@"+host, "query"))!=0) { ... } 或者这个(@Arkant

这种速记是一种不好的做法吗?或者任何具有Java基本知识的程序员都应该知道,如果
主机
等于
“localhost”
,则在下面的代码中,checkDoSResult不会被重新分配

您可以选择:

int checkDoSResult = 0;
if (!"localhost".equals(host) && (checkDoSResult = CheckHost.checkDoS(user+"@"+host, "query"))!=0) {
    ...
}
或者这个(@Arkantos):

两个代码段的功能相同,但哪一个更容易阅读?我会选择第二个选项。

事实上,“任何具有Java基本知识的程序员”都知道一些东西,但这并不一定意味着“某些东西”是一个好的实践

众所周知,条件和循环头中的赋值很难识别,因为程序员的眼睛期望的是条件,而不是赋值。将赋值放在逻辑表达式的短路部分只会使事情变得更糟


当然,任何受过良好培训的程序员都能够准确地“解读”你想说的话,但这需要时间。将条件分为两部分,并将赋值放在
if
语句的正文中,这将有助于其他人理解您的意图,这比保存几行代码更重要。

这是一种糟糕的做法。这很容易理解发生了什么,但当你这样写的时候,它肯定更难阅读。我认为如果条件
checkDoSResult!=0
应该在重新分配后进入第一个值。这其实并不重要,因为如果第一个
为真,则
checkDoSResult
只会与零不同。但我还是会编辑的,你说的方式更有意义。我会保留两个版本。我喜欢避免另一个缩进级别:)这不仅仅是缩进:)根据OP的代码,有一个
&
操作符,这意味着只有当第一个条件为真时,才会计算第二个条件。这就是为什么我要求你把第二个if条件移到里面,否则第二个if条件总是经过计算的。因为第二个
如果
条件没有副作用,那就不重要了。但你是完全正确的:第二个条件,事实上,是被不必要的评估。
int checkDoSResult = 0;
if (!"localhost".equals(host) && (checkDoSResult = CheckHost.checkDoS(user+"@"+host, "query"))!=0) {
    ...
}
int checkDoSResult = 0;
if (!"localhost".equals(host)) {
    checkDoSResult = CheckHost.checkDoS(user+"@"+host, "query");
    if (checkDoSResult != 0) {
        ...
    }
}