天天看點

lombok @EqualsAndHashCode 注解的影響

官方文檔:@EqualsAndHashCode

原文中提到的大緻有以下幾點: 

1. 此注解會生成

equals(Object other)

 和 

hashCode()

方法。 

2. 它預設使用非靜态,非瞬态的屬性 

3. 可通過參數

exclude

排除一些屬性 

4. 可通過參數

of

指定僅使用哪些屬性 

5. 它預設僅使用該類中定義的屬性且不調用父類的方法 

6. 可通過

callSuper=true

解決上一點問題。讓其生成的方法中調用父類的方法。

另:

@Data

相當于

@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode

這5個注解的合集。

通過官方文檔,可以得知,當使用

@Data

注解時,則有了

@EqualsAndHashCode

注解,那麼就會在此類中存在

equals(Object other)

hashCode()

方法,且不會使用父類的屬性,這就導緻了可能的問題。 

比如,有多個類有相同的部分屬性,把它們定義到父類中,恰好id(資料庫主鍵)也在父類中,那麼就會存在部分對象在比較時,它們并不相等,卻因為lombok自動生成的

equals(Object other)

hashCode()

方法判定為相等,進而導緻出錯。

修複此問題的方法很簡單: 

1. 使用

@Getter @Setter @ToString

代替

@Data

并且自定義

equals(Object other)

hashCode()

方法,比如有些類隻需要判斷主鍵id是否相等即足矣。 

2. 或者使用在使用

@Data

時同時加上

@EqualsAndHashCode(callSuper=true)

注解。

繼續閱讀