equals()とhashCode()をオーバーライドしないと何が起きるか | TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
equals()のみをオーバーライドしhashCode()を放置すると、同一内容のオブジェクトであっても異なるハッシュ値が生成される。これにより、ハッシュベースのコレクションにおいて要素が異なるバケットに格納され、重複排除やキーによる値の取得が正しく機能しなくなるという、データ整合性の欠如を招く。
// Approach
Javaの契約(Contract)に基づき、equals()がtrueを返すオブジェクトは必ず同一のhashCode()を返すよう、両メソッドをセットで実装する手法を提示している。具体的には、Objects.hash()を用いた実装や、Lombokの@EqualsAndHashCodeによる自動生成による効率化を推奨している。
// Result
適切なオーバーライドにより、値ベースの比較とハッシュベースのコレクションにおける期待通りの動作が保証される。これにより、開発者が意図しない重複データの混入や、存在すべきデータの検索失敗といった、デバッグが困難な論理バグを未然に防ぐことが可能となる。
Senior Engineer Insight
> 基礎的な内容だが、大規模・高負荷なシステムにおいて、不適切なハッシュ実装による「見えない重複」は、メモリ消費の増大やビジネスロジックの破綻を招く致命的なリスクである。手動実装によるヒューマンエラーを排除するため、Lombok等のツールによる自動生成をプロジェクトの標準とし、コードレビューでは「equalsとhashCodeの契約」が遵守されているかを厳格にチェックすべきである。