继承抽象类的子类如何实现equals方法?父类含Id字段场景
正确实现继承抽象类的JPA子类equals方法
错误原因分析
你遇到的编译错误是因为原代码误用了id字段和getId()方法——抽象类Car中定义的主键字段是taskId,Lombok的@Getter注解会为其生成getTaskId()方法,而非getId(),子类ChangeTyre继承了父类的方法,但不存在id字段和getId()方法,因此编译器报错。
基础修正后的equals实现
直接调用父类继承来的getTaskId()方法获取主键进行比较即可:
@Override public boolean equals(Object o) { // 引用相同直接返回true if (this == o) return true; // 类型不匹配返回false if (!(o instanceof ChangeTyre)) return false; ChangeTyre other = (ChangeTyre) o; // 利用父类的getTaskId()方法比较主键 return getTaskId() != null && getTaskId().equals(other.getTaskId()); }
JPA实体场景下的进阶实现
由于这是JPA实体,需要考虑实体未持久化时主键未生成的情况(新创建的实体还未存入数据库,taskId为null),此时可以结合业务唯一键(比如ChangeTyre中标注为unique = true的code字段)实现更健壮的equals逻辑:
@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof ChangeTyre)) return false; ChangeTyre other = (ChangeTyre) o; // 主键存在时优先用主键比较 if (getTaskId() != null && other.getTaskId() != null) { return getTaskId().equals(other.getTaskId()); } // 主键不存在时,用业务唯一键code比较 return getCode() != null && getCode().equals(other.getCode()); }
配套重写hashCode方法
根据Java规范,equals和hashCode的逻辑必须保持一致,否则会导致HashMap、HashSet等集合出现异常行为。对应上面的进阶实现,hashCode可以这样写:
@Override public int hashCode() { // 主键存在时用主键生成哈希值,否则用业务唯一键,最后 fallback 到父类哈希 return getTaskId() != null ? getTaskId().hashCode() : (getCode() != null ? getCode().hashCode() : super.hashCode()); }
内容的提问来源于stack exchange,提问作者Ray Bond
相关产品推荐
相关产品推荐

