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,以便在更改字段的数据类型时出现编译错误?
答案 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
,那么您应该始终检查受影响的代码。如果您想要通用实践的代码解决方法(双重检查),您可能会在整个应用程序中引入过于复杂的代码。
如果您意识到这个问题,为什么不直接在受影响的类属性上添加注释,可以通过==进行比较。如果您想要或其他开发人员想要稍后更改它的类型,他们将被警告。