Java 如何使用typesafe检查布尔值的相等性?

Java 如何使用typesafe检查布尔值的相等性?,java,comparator,Java,Comparator,现在,例如,当我将ComplexObject中的数据类型从boolean更改为String时,比较器不会中断,我也不会注意到将来我会比较字符串而不是布尔值,从而得到不同的结果 问题:如何比较布尔属性类型安全,以便在更改字段的数据类型时出现编译错误?您可以做一些事情,但所有这些都会降低代码的可读性,因此我建议不要这样做 例如: public class ComplexObject { private boolean isA, isB; } //custom comparator publ

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


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

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

例如:

public class ComplexObject {
    private boolean isA, isB;
}

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


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

例如:

public class ComplexObject {
    private boolean isA, isB;
}

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


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

return (o1.getIsA() && o2.getIsB()) ||  (!o1.getIsA() && !o2.getIsB());
您还可以定义一个只接受
布尔值的方法:

return (boolean)o1.getIsA() == (boolean)o2.getIsB();
然后调用
booleanEquals
,而不是使用
=



顺便说一句,这个编程对我来说似乎有点过于保守。

一件非常简单的事情就是加入一个多余的演员阵容:

return (o1.getIsA() && o2.getIsB()) ||  (!o1.getIsA() && !o2.getIsB());
您还可以定义一个只接受
布尔值的方法:

return (boolean)o1.getIsA() == (boolean)o2.getIsB();
然后调用
booleanEquals
,而不是使用
=



顺便说一句,这个编程对我来说似乎有点过于保守。

您可以使用XOR:

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

您可以使用XOR进行以下操作:

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

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

如果您将属性从
boolean
重构为
String
,那么您应该始终检查受影响的代码。如果您希望为一种常见做法(双重检查)提供代码变通方法,则可能会在整个应用程序中引入过于复杂的代码


如果您知道这个问题,为什么不直接在受影响的类属性上添加注释,以便通过==进行比较呢。如果您希望或其他开发人员希望稍后更改其类型,他们将收到警告。

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

如果您将属性从
boolean
重构为
String
,那么您应该始终检查受影响的代码。如果您希望为一种常见做法(双重检查)提供代码变通方法,则可能会在整个应用程序中引入过于复杂的代码



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

为什么您不能只使用.equals方法,这样它就可以工作,用于字符串或任何您将使用的类型?
boolean b1=o1.getIsA()
将基本上一成不变。@maslan因为boolean不支持.equals()方法。@MarkoTopolnik,为什么不直接使用包装布尔值?@maslan包装器将是一个未使用的装箱+拆箱。为什么您不能直接使用.equals方法,这样它就可以工作,用于字符串或任何您将使用的类型?
Boolean b1=o1.getIsA()
将几乎一成不变。@maslan因为布尔值不支持.equals()方法。@MarkoTopolnik so,为什么不使用包装布尔值?@maslan包装将是一个未使用的装箱+拆箱。在我的情况下,过度防御不是,因为我刚刚无意中打开了这个问题,并试图在将来解决这个牢不可破的问题。“过度防御不是在我的情况下”好吧,当然。我不是在评判,我只是觉得有必要指出它背后的原因。两个演员中只有一个可以做到。@MarkoTopolnik这是真的。就我个人而言,我通常会选择双方,因为我认为这更清楚。过度防御不在我的情况下,因为我只是偶然发现了这个问题,并试图在未来解决这个牢不可破的问题。“过度防御不在我的情况下”好吧,当然。我不是在评判,我只是觉得有必要指出它背后的原因。两个演员中只有一个可以做到。@MarkoTopolnik这是真的。就我个人而言,因为我认为这更清楚,所以我通常会选择两面。强静态类型存在的大多数原因都是防御性的。@Radiodef好吧,这里的大多数解决方案都是不可读的,但是你的类型选择看起来很优雅,对我来说没有太大开销。强静态类型存在的大多数原因都是防御性的。@Radiodef好吧,这里的大多数解决方案都不可读,但您的铸造变体看起来很优雅,对我来说没有太大的开销。