我个人比较喜欢的异或 , ^
,运营商,当它是有道理的,因为它简洁布尔检查的范围内。 我更喜欢写
if (boolean1 ^ boolean2)
{
//do it
}
比
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
但我经常收到来自其他有经验的Java开发人员(不只是新手)困惑的样子,有时评论如何,应该只用于位运算。
我很好奇,对于实际使用情况的最佳实践^
运营商。
Answer 1:
Answer 2:
我想你已经回答了你自己的问题 - 如果你从人们异样的眼光,它可能是更安全的去与更明确的选择。
如果你需要评述吧,那么你很可能关闭与更详细的版本替换它,而不是让人们问摆在首位的问题更好。
Answer 3:
我发现我也有类似的谈话很多。 在一方面,你有实现目标的紧凑,有效的方法。 在另一方面,你有什么事情,你的团队的其他人可能不理解,很难在未来维持。
我的一般原则是要问,如果正在使用的技术是什么,它是合理的期望一般程序员知道。 在这种情况下,我认为这是合理的预期程序员知道如何使用布尔运算符,因此使用XOR在if语句是好的。
由于一些例子,不会是好的,采取使用XOR交换两个变量,而无需使用临时变量的伎俩。 这是我不希望每个人都熟悉一招,所以它不会通过代码审查。
Answer 4:
我觉得这是好的,如果你评论它,例如// ^ == XOR
。
Answer 5:
你可能永远都只是把它包在一个函数给它一个冗长的名字:
public static boolean XOR(boolean A, boolean B) {
return A ^ B;
}
但是,在我看来,它不会是很难的人谁不知道^运算符是什么,以谷歌真的很快。 它不会是很难在第一时间之后记住。 既然你问其他用途,其共同使用为位掩码的XOR。
您也可以使用XOR交换两个变量的值,而不使用第三临时变量 。
// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;
这里有一个相关的XOR交换问题#1 。
Answer 6:
我最近使用的异或在工作中的JavaScript项目,并最终增加7条线的注释来解释发生了什么事情。 在这种情况下使用XOR的理由是,该条款(一term1
在下面的例子中)可以采取不是两个而是三个值: undefined
, true
或false
,而其他( term2
)可能是true
还是false
。 我将不得不增加额外的检查,对undefined
情况下,但异,以下就足够了,因为异或迫使第一项先计算为布尔,让undefined
得到视为false
:
if (term1 ^ term2) { ...
这是,最终,有点矫枉过正,但我想保持它在那里无论如何,作为一个排序复活节彩蛋。
Answer 7:
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
恕我直言,这个代码可以简化为:
if(boolean1 != boolean2)
{
//do it
}
Answer 8:
考虑到代码的清晰,我的意见是,在布尔检查使用XOR不是为XOR位运算符典型的用法。 从我的经验,在Java位异或通常用于实现屏蔽flag toggle
行为:
flags = flags ^ MASK;
此文章由Vipan Singla介绍了使用情况更详细。
如果您需要使用按位异或在你的榜样,评论,为什么你使用它,因为它可能需要连按位有文化的观众停止在其轨道理解为什么你正在使用它。
Answer 9:
如果使用模式需要如此,为什么不呢? 当你的团队不承认经营者马上,随着时间的推移,他们可以。 人类学习新词所有的时间。 为什么不编程?
我可能会说出唯一需要注意的是,“^”没有你的第二个布尔检查短路语义。 如果你真的需要短路语义,那么静态util的方法也可以。
public static boolean xor(boolean a, boolean b) {
return (a && !b) || (b && !a);
}
Answer 10:
我个人比较喜欢“boolean1 ^ boolean2”表达,由于其简洁。
如果我是您的情况(在一个团队中工作),我会被封装在一个描述性的名称的函数“boolean1 ^ boolean2”逻辑,如“isDifferent(boolean1,boolean2)”达成妥协。
例如,而不是使用 “boolean1 ^ boolean2”,你会叫 “isDifferent(boolean1,boolean2)” 像这样:
if (isDifferent(boolean1, boolean2))
{
//do it
}
您的 “isDifferent(boolean1,boolean2)” 功能将如下所示:
private boolean isDifferent(boolean1, boolean2)
{
return boolean1 ^ boolean2;
}
当然,这种解决方案需要使用一个表面上无关的函数调用,这本身就是受最佳实践推敲的,但它避免了冗长(丑)表达“(boolean1 &&!boolean2)||(boolean2 &&!boolean1) “!
Answer 11:
!=是OK比较两个变量。 它不工作,虽然与多重比较。
Answer 12:
str.contains("!=") ^ str.startsWith("not(")
看起来比更好地为我
str.contains("!=") != str.startsWith("not(")
Answer 13:
作为位运算符,XOR是远远快于任何其他方式来取代它。 因此,对于性能的关键,可扩展的计算,XOR势在必行。
我的主观个人的意见:这是绝对禁止的,用于任何目的,使用等号(==或=!)的布尔值。 使用它显示了缺乏基本的编程道德和基本面。 任何人谁给你迷茫纵观^应该被送回布尔代数的基本知识(我很想写“来的信念河流”在这里:))。
文章来源: Is it good practice to use the xor operator for boolean checks?