gpt4 book ai didi

Java @Override equals() : When this. getClass() != o.getClass() 失败但不应该

转载 作者:行者123 更新时间:2023-12-05 00:51:28 26 4
gpt4 key购买 nike

我的 MyClass 类中有 equals() 的 @Override:

@Entity( name = "MyClass" )
@Table( name = "my_class" )
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 最佳实践。
后来我在另一个子包类(我的 Controller 类)中有这个:

...
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 IDEA 2022.1 UE 中)我看到了这个:

this.getClass() = MyClass@13706

但是

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

但他们同一类!几乎所有 Java 书籍、教程、博客、Intellij IDEA 等都以这种方式演示了 .equals()。我在 Ubuntu 20.04.4 LTS java-14-openjdk-amd64java-17-openjdk-amd64 中尝试过,结果相同。

我做错了什么?

最佳答案

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

作为 getClass() 的替代方法,使用 instanceof 可能是另一种方法:

if ( !(this instanceof MyClass && o instanceof MyClass) )
{
return false;
}

但请记住,instanceof 有它的 drawbacks .它违反了对称性原则。

您不应该首先比较这些对象,因为新对象应该不同于具有持久状态的 Hibernate 托管对象。

关于Java @Override equals() : When this. getClass() != o.getClass() 失败但不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71873676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com