检查Java中两个对象是否完全相同

Guy*_*Guy 21 java

我有一个Java类,这是一个例子:

public class Car {

    private int fuelType;
    private Date made;
    private String name;
.
.
. // and so on
Run Code Online (Sandbox Code Playgroud)

现在让我们说我有两个车对象,我想比较它们的所有变量是否相等.

现在,我通过重写方法解决了这个问题,equals(Object o)并检查两个对象中的所有变量是否匹配.

这里的问题是,如果我有20个类,我将不得不覆盖它们equals(Object o)中的每一个.

有没有办法创建某种通用方法,可以比较我传递给它的两个对象中的任何一个,并让我知道它们是否匹配每个变量?

Mic*_*mlk 23

你有一些自动化Equals&Hashcode的选项(选项#3 BLEW MY MIND!):

  1. 你骑.我不推荐它用于大多数对象,因为它们可以慢慢地与实际的类定义过时.它们看起来也很丑陋并且用样板代码污染了你的代码库.
  2. Apache Commons有很多东西可以让它变得更容易,包括一个反射版本,所以没有过时类定义过时的风险.它比#1更好,除非你需要一个快速的equals/hashcode,但仍然是我喜欢的太多样板.
  3. 项目龙目岛和注释处理.EqualsAndHashCode在ya类上做一个注释并完成它.我建议使用Project Lombok.它为构建添加了一些魔力(但并不多),因此需要一个IDE的插件才能很好地运行,但它们是一个很小的代价,无需样板代码.Lombok是一个在编译时运行的注释处理器,因此您不会遇到运行时性能损失.
  4. 使用支持它的不同语言,但也针对JVM.Groovy使用注释,Kotlin支持数据类.除非您现有的代码可以快速转换,否则我会避免这种情况.
  5. 谷歌的Auto有一个AutoValue.就像Project Lombok一样,这是一个注释处理器,但是以更少的样板而牺牲了更少的魔力(感谢Louis Wasserman)

  • 根据我的经验(处理一些相对较大的250k + LOC Java应用程序),反射往往会使代码更难理解和维护,并且在引入之前应该仔细考虑(忽略可能的性能问题,以后可以根据具体情况轻松解决)无论如何这里的基础).我不记得由于在更改数据函数的状态时忘记调整equals方法而导致的单个错误.这些数据类往往相当简短,因此至少在代码审查中很容易被捕获. (2认同)

hic*_*086 5

您可以使用 :

 org.apache.commons.lang.builder.CompareToBuilder.reflectionCompare(Object lhs, Object rhs);
Run Code Online (Sandbox Code Playgroud)

它使用反射来比较这里的文件是javadoc:javadoc