如何类型安全地检查布尔值是否相等?
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 属性上发表评论,它可能会与 == 进行比较。如果您想要或其他开发人员想要稍后更改它的类型,他们将收到警告。
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 属性上发表评论,它可能会与 == 进行比较。如果您想要或其他开发人员想要稍后更改它的类型,他们将收到警告。