如何安全检查布尔值的平等?

时间:2015-02-12 11:07:24

标签: java comparator

public class ComplexObject {
    private boolean isA, isB;
}

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

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

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

4 个答案:

答案 0 :(得分:3)

你可以做的一件非常简单的事情就是加入一个多余的演员:

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

您还可以定义仅接受boolean的方法:

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

然后拨打booleanEquals而不是==


作为旁注,这个编程对我来说似乎有点过于防守。

答案 1 :(得分:1)

您可以执行一些操作,但所有这些操作都会降低您的代码的可读性,因此我会建议不要使用它们。

例如:

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

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

答案 2 :(得分:0)

您可以使用XOR:

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

答案 3 :(得分:0)

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

如果您将属性从boolean重构为String,那么您应该始终检查受影响的代码。如果您想要通用实践的代码解决方法(双重检查),您可能会在整个应用程序中引入过于复杂的代码。

如果您意识到这个问题,为什么不直接在受影响的类属性上添加注释,可以通过==进行比较。如果您想要或其他开发人员想要稍后更改它的类型,他们将被警告。