1. 概述
在Java中,布尔(Boolean)是一种基础数据类型,通常只有两种取值:true
或 false
。
本教程将讨论如何切换给定的布尔变量。
2. 问题介绍
这个问题相当直接:简单来说,我们需要改变一个布尔变量的值,例如,将 true
转换为 false
。
然而,我们需要注意,Java中有两种不同的布尔类型:原始类型的boolean
和封装类Boolean
。因此,理想的切换方法应该适用于这两种类型。
在这篇教程中,我们将探讨如何实现这样的方法,并使用单元测试断言来验证我们的实现是否符合预期。
首先,我们将从切换原始类型的boolean
变量开始,这是我们最终toggle()
方法的基础。
3. 切换原始类型的boolean
变量
最直观的方法是使用逻辑非运算符(!)来切换原始的boolean
变量。
让我们创建一个测试来看看效果:
boolean b = true;
b = !b;
assertFalse(b);
b = !b;
assertTrue(b);
如果运行这个测试,它会通过。这意味着每次对boolean
变量应用逻辑非运算符,其值都会反转。
另一种选择是使用异或运算符(^)来切换布尔值。在考虑实现之前,先快速了解一下异或运算符的工作原理。
对于两个boolean
变量b1
和b2
,b1 ^ b2
只有在b1
和b2
的值不同时才为true
,例如:
-
true ^ true = false
-
false ^ false = false
-
true ^ false = true
因此,我们可以利用异或运算符的特性,通过执行b ^ true
来反转b
的值:
-
b = true -> b ^ true
变为true ^ true = false
-
b = false -> b ^ true
变为false ^ true = true
现在我们理解了异或运算的逻辑,将其转化为Java代码对我们来说并不困难:
boolean b = true;
b ^= true;
assertFalse(b);
b ^= true;
assertTrue(b);
不出所料,当我们运行这个测试时,它通过了。
4. 创建toggle()
方法
我们已经看到,原始的boolean
变量只有两种可能的值:true
和 false
。然而,与原始的boolean
不同,封装的Boolean
变量可以包含null
。
当我们在Boolean
变量上执行逻辑非或异或操作时,Java会自动将其转换为boolean
。但如果我们没有妥善处理null
情况,可能会遇到NullPointerException
:
assertThatThrownBy(() -> {
Boolean b = null;
b = !b;
}).isInstanceOf(NullPointerException.class);
如果运行上面的测试,它通过了。不幸的是,这意味着当我们执行!b
时,会出现NullPointerException
。
接下来,让我们创建一个安全处理null
的toggle()
方法,以支持Boolean
和boolean
变量:
static Boolean toggle(Boolean b) {
if (b == null){
return b;
}
return !b;
}
在这里,我们首先进行null
检查,然后使用逻辑非运算符来反转值。当然,在null
检查后,我们也可以选择使用异或方法来反转b
的值。
最后,让我们创建一个测试来验证toggle()
方法能否处理所有情况:
// boxed Boolean
Boolean b = true;
b = ToggleBoolean.toggle(b);
assertFalse(b);
b = ToggleBoolean.toggle(b);
assertTrue(b);
b = null;
b = ToggleBoolean.toggle(b);
assertNull(b);
// primitive boolean
boolean bb = true;
bb = ToggleBoolean.toggle(bb);
assertFalse(bb);
bb = ToggleBoolean.toggle(bb);
assertTrue(bb);
如测试所示,我们用Boolean
变量和boolean
变量测试了toggle()
方法,并且测试了Boolean
变量b
为null
的情况。
当执行测试时,它通过了。因此,我们的toggle()
方法按预期工作。
5. 总结
在这篇文章中,我们学习了如何构建一个安全处理null
的函数,用于切换给定的boolean/Boolean
变量。
如往常一样,本文的相关代码可以在GitHub上找到。