1. 概述

在Java中,布尔(Boolean)是一种基础数据类型,通常只有两种取值:truefalse

本教程将讨论如何切换给定的布尔变量。

2. 问题介绍

这个问题相当直接:简单来说,我们需要改变一个布尔变量的值,例如,将 true 转换为 false

然而,我们需要注意,Java中有两种不同的布尔类型:原始类型的boolean和封装类Boolean。因此,理想的切换方法应该适用于这两种类型。

在这篇教程中,我们将探讨如何实现这样的方法,并使用单元测试断言来验证我们的实现是否符合预期。

首先,我们将从切换原始类型的boolean变量开始,这是我们最终toggle()方法的基础。

3. 切换原始类型的boolean变量

最直观的方法是使用逻辑非运算符(!)来切换原始的boolean变量。

让我们创建一个测试来看看效果:

boolean b = true;
b = !b;
assertFalse(b);

b = !b;
assertTrue(b);

如果运行这个测试,它会通过。这意味着每次对boolean变量应用逻辑非运算符,其值都会反转。

另一种选择是使用异或运算符(^)来切换布尔值。在考虑实现之前,先快速了解一下异或运算符的工作原理。

对于两个boolean变量b1b2b1 ^ b2只有在b1b2的值不同时才为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变量只有两种可能的值:truefalse。然而,与原始的boolean不同,封装的Boolean变量可以包含null

当我们在Boolean变量上执行逻辑非或异或操作时,Java会自动将其转换为boolean。但如果我们没有妥善处理null情况,可能会遇到NullPointerException

assertThatThrownBy(() -> {
    Boolean b = null;
    b = !b;
}).isInstanceOf(NullPointerException.class);

如果运行上面的测试,它通过了。不幸的是,这意味着当我们执行!b时,会出现NullPointerException

接下来,让我们创建一个安全处理nulltoggle()方法,以支持Booleanboolean变量:

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变量bnull的情况。

当执行测试时,它通过了。因此,我们的toggle()方法按预期工作。

5. 总结

在这篇文章中,我们学习了如何构建一个安全处理null的函数,用于切换给定的boolean/Boolean变量。

如往常一样,本文的相关代码可以在GitHub上找到。