如何类型安全地检查布尔值是否相等?

How to typesafe check equality of booleans?

public class ComplexObject {
    private boolean isA, isB;
}

//custom comparator
public boolean checkComplexObject(ComplexObject o1, ComplexObject o2) {
   return o1.getIsA() == o2.getIsB();
}

现在,当我将 ComplexObject 中的数据类型从 boolean 更改为 String 时,比较器不会中断,我也不会注意到将来我会比较字符串而不是布尔值,从而得到不同的结果。

问题:如何比较布尔属性类型安全,以便在更改字段的数据类型时出现编译错误?

您可以做一些事情,但所有这些都会降低您的代码的可读性,因此我建议您不要这样做。

例如:

return o1.getIsA() ^ o2.getIsB() == false;

return (o1.getIsA() && o2.getIsB()) ||  (!o1.getIsA() && !o2.getIsB());

您可以做的一件非常简单的事情就是进行冗余转换:

return (boolean)o1.getIsA() == (boolean)o2.getIsB();

你也可以定义一个方法只接受boolean:

static boolean booleanEquals(boolean a, boolean b) {
    return a == b;
}

然后调用 booleanEquals 而不是使用 ==


附带说明一下,这个程序对我来说似乎有点过度防御。

您可以为此使用 XOR:

return o1.getIsA() ^ o2.getIsB();

更好的问题是,你为什么要那样做?

如果您将属性从 boolean 重构(好吧,大量更改)到 String,您应该始终检查受影响的代码。如果您想要针对常见做法(双重检查)的代码解决方法,您可能会在整个应用程序中引入过于复杂的代码。

如果您知道这个问题,为什么不直接在您受影响的 class 属性上发表评论,它可能会与 == 进行比较。如果您想要或其他开发人员想要稍后更改它的类型,他们将收到警告。