首页 > 编程语言 >java 重写equals方法 最佳实践 Java@Override equals():当this.getClass()!=o.getClass()失败

java 重写equals方法 最佳实践 Java@Override equals():当this.getClass()!=o.getClass()失败

时间:2023-01-11 09:12:47浏览次数:57  
标签:... getClass return equals MyClass Override java

java 重写equals方法 最佳实践 Java@Override equals():当this.getClass()!=o.getClass()失败
https://www.5axxw.com/questions/content/dn5jai

我在MyClass中有一个@Override for equals():

public class MyClass extends MySuperClass
{
  ...
  @Override
  public boolean equals( Object o )
  {
    if ( this == o )
    {
      return true;
    }
    if ( o == null || this.getClass() != o.getClass() )
    {
      return false;
    }
    if ( !super.equals( o ) )
    {
      return false;
    }
    MyClass that = ( MyClass ) o;
    return this.var1.equals( that.var1 ) && this.var2.equals( that.var2 );
  }
  ...
}

相当标准。事实上,它遵循Java最佳实践。在以后的生活中,我在另一个sub-package类(我的控制器类)中有这个:

...
package com.a.b.api.controllers;
...
import com.a.b.jpa.models.MyClass;
...
MyClass myObject1 = new MyClass( var1, var2 );
MyClass myObject2 = this.myClassRepository.getById( 1 ); // SpringBoot/Jpa/Hibernate

if ( myObject2.equals( myObject1 ) )
{
...do something...
}
...
this.myClassRepository.save( myObject1 );
...

我的问题是。equals()在这里总是失败:

if ( o == null || this.getClass() != o.getClass() )

因为java说this.getClass()和o.getClass()不相等。当我调试代码(在Intellij IDEA2022.1 UE中)时,我看到:

this.getClass() = MyClass@13706

but

o.getClass = com.a.b.jpa.models.MyClass@8f7462

但他们是同一个阶级!几乎每一本Java书籍、教程、博客、Intellij IDEA等都演示了这一点。这样。我在Ubuntu20.04.4 LTSjava-14-openjdk-amd64和java-17-openjdk-amd64中尝试过这个方法,得到了相同的结果。

我做错了什么?

happy hongs在回答中正确地指出:

myObject2是一个代理类的实例,由Hibernate在运行时使用Byte Buddy生成。生成的代理截获所有方法调用,这就是getClass()返回不同结果的原因。

我真的不想使用instanceof,因为这被认为是不好的做法,所以我开始四处闲逛,偶然发现了一个类似的问题。他们的解决方案是在类声明中添加最后一个关键字。我认为这无关紧要,但尝试了一下——成功了!添加最后一个关键字

if ( o == null || this.getClass() != o.getClass() )

and

if ( o == null || !this.getClass().equals( o.getClass() ) )

正常工作。我的班级代码是:

final public class MyClass extends MySuperClass
{
  ...
  @Override
  public boolean equals( Object o )
  {
    if ( this == o )
    {
      return true;
    }
    if ( o == null || !this.getClass().equals( o.getClass() ) )
    {
      return false;
    }
    if ( !super.equals( o ) )
    {
      return false;
    }
    MyClass that = ( MyClass ) o;
    return this.var1.equals( that.var1 ) && this.var2.equals( that.var2 );
  }
  ...
}

谢谢大家的帮助!非常感谢快乐歌曲为我指明了正确的方向!

标签:...,getClass,return,equals,MyClass,Override,java
From: https://www.cnblogs.com/sunny3158/p/17042790.html

相关文章

  • 【Java源码解析】如何严谨地重写 equals 方法、getClass 方法与 instanceof 关键词用
    【Java源码解析】如何严谨地重写equals方法、getClass方法与instanceof关键词用法比较https://blog.csdn.net/m0_46360532/article/details/123118780文章目......
  • Java学习路线总结
    认清现实,放弃幻想。(特此感谢动力节点老杜分享出来的学习路线)学习阶段阶段地址第一阶段:JavaSE基础入https://www.cnblogs.com/NorthPoet/p/1702......
  • JavaScript所有内部属性列表 [[Configurable]] 等
    简介据MDN文档所说内部属性是由[[···]]包裹的内容,于是我们去复制ECMA-262标准的所有文字部分,然后用正则统计[[···]]的出现并打印效果代码经老大提醒,这里......
  • Java课程设计之——Web前端设计
    0、团队课程设计1、主要使用的技术HTML/CSSBootstrap5javascript/jQuery/jQuery-UIJSP2、前期调查与设计搜索引擎主要分为两个界面,主界面和搜索结果界面主界面......
  • Java中集合函数--ArrayList和HashMap
    ArrayList集合框架:ArrayList是一个数组队列,提供了相关的添加、删除、修改、遍历等功能先初始化对象:ArrayList<String>list=newArrayList<>();添加元素使用add()方法......
  • java企业人事管理系统企业工资考勤系统
    简介Java基于ssm开发的企业人事考勤工资系统,员工可以打卡、请假。系统根据员工的打卡情况自动计算工资(全勤、请假、旷工、加班、迟到、早退等计算出最终实发工资),员工还可......
  • Java线程诊断
    1.诊断CPU占用过高[root@master~]#nohupjava-jarJvmProject.jar&//有问题的java程序[1]1627[root@master~]#nohup:ignoringinputandappendingoutputto......
  • java:年号字串-------进制转换
    题目描述小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ......
  • Java课程设计之——Elasticsearch篇
    0、团队项目博客1、主要使用的技术及开发工具Elasticsearch7.17.3RESTAPIElasticsearchjavaAPIClient7.17.3Kibana7.17.3Jackson2.12.32、Elasticsearch......
  • JavaScript学习笔记—运算符
    运算符(操作符):可以用来对一个或多个操作数(值)进行运算1.算术运算符:+加法运算符-减法运算符*乘法运算符/触发运算符**幂运算%模运算算术运算时,除了字符串的加......