Java 我怎样才能得到一个有许多约束的equals方法
我正在研究一个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
整数
,价格为双精度
。我希望价格停在小数点后第二位,这就是为什么我有公差(设置为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页)