编写一个hashcode函数



我想为我的类编写一个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

最后,您只比较一个字段,所以该字段应该同时使用两种方法,正如另一个答案中所写的那样!

最新更新