Java 我怎样才能得到一个有许多约束的equals方法

Java 我怎样才能得到一个有许多约束的equals方法,java,Java,我正在研究一个equals方法,它将检查两个点是否相等。单点由数量和价格组成,其中数量为整数,价格为双精度。我希望价格停在小数点后第二位,这就是为什么我有公差(设置为0.01)。我不知道如何在equals()中获得这些约束。这就是我现在拥有的: public boolean equals (Point Other) { if((this.quantity == Other.quantity) && (Math.abs(this.price - Other.price)&l

我正在研究一个equals方法,它将检查两个点是否相等。单点由数量和价格组成,其中数量为
整数
,价格为
双精度
。我希望价格停在小数点后第二位,这就是为什么我有公差(设置为0.01)。我不知道如何在equals()中获得这些约束。这就是我现在拥有的:

public boolean equals (Point Other)
{
    if((this.quantity == Other.quantity) && (Math.abs(this.price - Other.price)<TOLERANCE)) return true;

    return false;
}
消息打印:

public void messagePrint(PointTestValues testResult){
    switch(testResult){
       case QP_EQUAL:
           // print message
           break;
       case Q_NOT_EQUAL_P_EQUAL:
           // print message
           break;
       case Q_EQUAL_P_NOT_EQUAL:
           // print message
           break;
       case PQ_NOT_EQUAL:
           // print message
           break;


    }
}
注意:在方法“comparePriceQuantity”中返回相应的枚举值,而不是int。我在评论中提供了它

主要功能:

messagePrint(point1.comparePriceQuantity(point2))
消息打印:

public void messagePrint(PointTestValues testResult){
    switch(testResult){
       case QP_EQUAL:
           // print message
           break;
       case Q_NOT_EQUAL_P_EQUAL:
           // print message
           break;
       case Q_EQUAL_P_NOT_EQUAL:
           // print message
           break;
       case PQ_NOT_EQUAL:
           // print message
           break;


    }
}
注意:在方法“comparePriceQuantity”中返回相应的枚举值,而不是int。我在评论中提供了它

主要功能:

messagePrint(point1.comparePriceQuantity(point2))
消息打印:

public void messagePrint(PointTestValues testResult){
    switch(testResult){
       case QP_EQUAL:
           // print message
           break;
       case Q_NOT_EQUAL_P_EQUAL:
           // print message
           break;
       case Q_EQUAL_P_NOT_EQUAL:
           // print message
           break;
       case PQ_NOT_EQUAL:
           // print message
           break;


    }
}
注意:在方法“comparePriceQuantity”中返回相应的枚举值,而不是int。我在评论中提供了它

主要功能:

messagePrint(point1.comparePriceQuantity(point2))
消息打印:

public void messagePrint(PointTestValues testResult){
    switch(testResult){
       case QP_EQUAL:
           // print message
           break;
       case Q_NOT_EQUAL_P_EQUAL:
           // print message
           break;
       case Q_EQUAL_P_NOT_EQUAL:
           // print message
           break;
       case PQ_NOT_EQUAL:
           // print message
           break;


    }
}
注意:在方法“comparePriceQuantity”中返回相应的枚举值,而不是int。我在评论中提供了它

主要功能:

messagePrint(point1.comparePriceQuantity(point2))

Joshua Bloch(有效Java,第二版)为在Java中重写
equals()
提供的一条格言如下(意译):

你不应该努力证明等价性。例如 对于
文件
类,
equals()
不应将符号链接带入 说明如何证明等价性。谢天谢地,事实并非如此

正如评论中指出的,你的目的不是寻求平等(而是寻求接近)。为此,您不应该重写
equals()
方法,我只想花点时间指出在这种情况下这样做的危险性(因为您的方法的签名不同,我注意到您没有重写equals,您正在重载它……但仍然如此)

来自
对象
类(Java中所有对象的父类)的
equals()
的契约:

  • 它是自反的:对于任何非空参考值x,x.equals(x)应该返回true
  • 它是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回真时,x.equals(y)才应返回真
  • 它是可传递的:对于任何非空参考值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)应该返回true
  • 一致性一致性:对于任何非空参考值x和y,如果没有修改对象上equals比较中使用的信息,多次调用x.equals(y)将一致返回true或一致返回false
  • 对于任何非空引用值x,x.equals(null)应返回false
虽然开发商可以自由修改本合同,但不得更改。集合框架尤其依赖于此契约的正确性。如果定义了违反此约定的
equals()
方法,则集合类可能会以难以调试的方式失败

基于公差创建等价性测试可能会违反
equals()
合同,因为失去传递性(合同中的第三点)

举例说明:

如果一个整数域与另一个对象的相同域在+/-10范围内,则表示对象相等

myObject a = new myObject(1);
myObject b = new myObject(6);
myObject c = new myObject(11);
对于这些对象:

a.equals(b)    evaluates to true
b.equals(c)    evaluates to true
a.equals(c)    evaluates to false

及物性被破坏,因此equals契约被打破。以这种方式定义
equals()
方法将导致依赖equals契约的任何类的不可预测行为。特别是集合类将无法正常工作。

Joshua Bloch(有效Java,第二版)为在Java中重写
equals()
提供的格言之一如下(意译):

public boolean quantityEqualWith (Point other)    {
    if(this.quantity == other.quantity) return true;
    return false;
}
public boolean priceEqualWith (Point other)    {
    if (Math.abs(this.price - other.price)<TOLERANCE) return true;
    return false;
}

public boolean isEqual(Point other)    {
    if(this.priceEqualWith(other)&&this.quantityEqualWith(other)) return true;
    return false;
}
public boolean isQuantityEqual (Point other)    {
    if((!this.priceEqualWith(other))&&(this.quantityEqualWith(other))) return true;
    return false;
}
public boolean isPriceEqual (Point other)    {
    if((this.priceEqualWith(other))&&(!this.quantityEqualWith(other))) return true;
    return false;
}
public boolean isNotEqual(Point other)    {
    if((!this.priceEqualWith(other))&&(!this.quantityEqualWith(other))) return true;
    return false;
}
你不应该努力证明等价性。例如 对于
文件
类,
equals()
不应将符号链接带入 说明如何证明等价性。谢天谢地,事实并非如此

正如评论中指出的,你的目的不是寻求平等(而是寻求接近)。为此,您不应该重写
equals()
方法,我只想花点时间指出在这种情况下这样做的危险性(因为您的方法的签名不同,我注意到您没有重写equals,您正在重载它……但仍然如此)

来自
对象
类(Java中所有对象的父类)的
equals()
的契约:

  • 它是自反的:对于任何非空参考值x,x.equals(x)应该返回true
  • 它是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回真时,x.equals(y)才应返回真
  • 它是可传递的:对于任何非空参考值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)应该返回true
  • 一致性一致性:对于任何非空参考值x和y,如果没有修改对象上equals比较中使用的信息,多次调用x.equals(y)将一致返回true或一致返回false
  • 对于任何非空引用值x,x.equals(null)应返回false
虽然开发商可以自由修改本合同,但不得更改。集合框架尤其依赖于此契约的正确性。如果定义了违反此约定的
equals()
方法,则集合类可能会以难以调试的方式失败

基于公差创建等价性测试可能会违反
equals()
合同,因为传递性丧失(第3页)