我想为我的类编写一个Hashcode函数。equals方法已存在。对于下面提到字段的类,什么可以作为一个好的hashcode()
。
public class ReservationSHC extends AuditableModel {
/** The log instance for this class * */
private static Log log = Log.getLog("RESERVATION");
private Long id;
private String shc;
private boolean systemGenerated;
private boolean notifyableLoadOrDGR;
private Integer versionId;
private String ownerCarrierCode;
private String shcDesc;
private String shcCategory;
private CargoRecord cargoRecord;
private ShipmentReservation shipmentReservation;
private Set additionalDataElements;
private boolean autoGenerated;
该类已存在Equals()
方法。
public boolean equals(Object arg0) {
if (arg0 instanceof ReservationSHC) {
ReservationSHC reservationSHC = (ReservationSHC) arg0;
if (reservationSHC.getShc().equals(this.shc)) {
return true;
}
} else if(arg0 instanceof String) {
String tempShc = (String) arg0;
if (tempShc.equals(this.shc)) {
return true;
}
}
return super.equals(arg0);
}
此外,我在equals方法上没有看到任何@override注释。它被覆盖了吗??
根据经验,只需使用IDE生成选择相关字段的equals((和hashCode((方法。
在这种情况下,看起来只有shc与对象的相等性相关,因此这些将是方法(由intelliJ生成(
import java.util.Objects;
.
.
.
private String shc;
.
.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Hello hello = (Hello) o;
return shc.equals(hello.shc);
}
@Override
public int hashCode() {
return Objects.hash(shc);
}
在你的情况下,我认为你也应该重新评估equals方法。将对象等同于字符串似乎不正确。
注释@Override
的目的只是在您做错事时向编译器发出警告。
示例:如果您将签名更改为
@Override
public boolean equals(String other)
那么编译器就会知道告诉你"不,这个equals()
方法不会覆盖任何内容"(因为它使用String
作为参数,但它必须是other
.
注意:您的equals()
实现是错误的。当任何x.equals(y)
为真时,那么y.equals(x)
也需要为真。而您直接与Strings进行比较的想法违反了该条件。示例:
yourObject.equals("some"); // could give true, when yourObject.shc is "some"
但是
"some".equals(yourObject); // will never be true, because yourObject isn't a string
最后,您只比较一个字段,所以该字段应该同时使用两种方法,正如另一个答案中所写的那样!