為了避免在 Java 中的 equals
方法中出現(xiàn)空指針異常(NullPointerException),你可以采取以下策略:
使用 Objects.equals()
方法:
從 Java 7 開始,java.util.Objects
類提供了一個(gè)靜態(tài)方法 equals()
,它可以幫助你避免空指針異常。這個(gè)方法會(huì)在比較之前檢查兩個(gè)參數(shù)是否為 null。
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyClass myClass = (MyClass) obj;
return Objects.equals(field1, myClass.field1) &&
Objects.equals(field2, myClass.field2);
}
使用 Apache Commons Lang3:
Apache Commons Lang3 庫(kù)提供了一個(gè)名為 EqualsBuilder
的類,它可以幫助你編寫不拋出空指針異常的 equals
方法。
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyClass myClass = (MyClass) obj;
return new EqualsBuilder()
.append(field1, myClass.field1)
.append(field2, myClass.field2)
.isEquals();
}
顯式檢查 null 值: 在比較字段之前,顯式地檢查它們是否為 null。
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyClass myClass = (MyClass) obj;
if (field1 != null ? !field1.equals(myClass.field1) : myClass.field1 != null) return false;
if (field2 != null ? !field2.equals(myClass.field2) : myClass.field2 != null) return false;
return true;
}
使用 Java 14 中的 record
類型:
如果你正在使用 Java 14 或更高版本,可以考慮使用新引入的 record
類型。record
類型自動(dòng)為你生成一個(gè)不會(huì)拋出空指針異常的 equals
和 hashCode
方法。
public record MyClass(String field1, String field2) {}
通過采用上述策略,你可以確保 equals
方法不會(huì)因?yàn)榭罩羔槷惓6鴮?dǎo)致程序崩潰。