当前位置:  开发笔记 > 编程语言 > 正文

Java equals():反映或不反映

如何解决《Javaequals():反映或不反映》经验,为你挑选了3个好方法。

此问题特别与覆盖具有大量字段的对象的equals()方法有关.首先,让我说这个大型对象不能在不违反OO原则的情况下分解为多个组件,因此告诉我"没有类应该有超过x个字段"将无济于事.

继续前进,当我忘记检查其中一个字段是否相等时,问题就开始了.因此,我的equals方法不正确.然后我想用反射:

--code removed because it was too distracting--

这篇文章的目的不一定是重构代码(这甚至不是我正在使用的代码),而是得到关于这是否是一个好主意的输入.

优点:

如果添加了新字段,则会自动包含该字段

如果语句,该方法比30多简洁

缺点:

如果添加了新字段,则会自动包含该字段,有时这是不合需要的

性能:这一点要慢一些,我觉得不需要打破一个分析器

将某些字段列入白名单以便在比较中忽略它有点难看

有什么想法吗?



1> Hank Gay..:

如果您因性能原因确实想要列入白名单,请考虑使用注释来指示要比较的字段.此外,如果您的字段没有良好的实现,则此实现将不起作用equals().

PS如果您选择这条路线equals(),请不要忘记做类似的事情hashCode().

PPS我相信你已经考虑过HashCodeBuilder和EqualsBuilder.



2> MetroidFan20..:

使用Eclipse,FFS!

删除hashCode并等于您拥有的方法.

右键单击该文件.

选择Source-> Generate hashcode并等于...

完成!不再担心反思.

对每个添加的字段重复,只需使用大纲视图删除两个方法,然后让Eclipse自动生成它们.


虽然比手工编写方法更容易,但这与反射和手工编码方法的主要缺点相同.添加字段并且不重新生成方法时,该方法仍然可能过时,并且仍然可以检查当某人重新生成方法并忘记删除检查时不应该检查的字段.

3> daveb..:

如果你采用反思方法,EqualsBuilder仍然是你的朋友:

 public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
 }

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有