栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为equals()实现选择字段的最佳实践

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为equals()实现选择字段的最佳实践

在语义上而非技术上,实现最佳实践的最佳方法是平等。

在Java中,由于该

equals
方法如何与实现集成在一起,因此实际上应将其视为“身份相等”。考虑以下:
Collection``Map

 public class Foo() {    int id;    String stuff; } Foo foo1 = new Foo(10, "stuff");  fooSet.add(foo1); ... Foo foo2 = new Foo(10, "other stuff");  fooSet.add(foo2);

如果

Foo
身份是
id
字段,则第2次
fooSet.add(...)
应该 没有
其他元素添加到
Set
,但应该返回
false
,因为
foo1
与
foo2
具有相同
id
。如果定义
Foo.equals
(和hashCode)方法包括
两 对
id
和
stuff
领域那么这可能会被打破,因为
Set
可能含有具有相同id字段2点的参考对象。

如果您没有将对象存储在

Collection
(或
Map
)中,则不必以
equals
这种方式定义方法,但是许多人认为它是错误的形式。如果将来您
确实 将其存储在a中,
Collection
那么事情将会崩溃。

如果我 需要 测试所有字段的相等性,则倾向于编写另一种方法。诸如此类的东西

equalsAllFields(Object obj)
。

然后,您将执行以下操作:

assertTrue(obj1.equalsAllFields(obj2));

另外,一种适当的做法是 不要
定义

equals
考虑可变字段的方法。当我们开始谈论类层次结构时,这个问题也变得很困难。如果子对象定义
equals
为其本地字段 和
基类的组合,
equals
则违反了其对称性:

 Point p = new Point(1, 2); // ColoredPoint extends Point ColoredPoint c = new ColoredPoint(1, 2, Color.RED); // this is true because both points are at the location 1, 2 assertTrue(p.equals(c)); // however, this would return false because the Point p does not have a color assertFalse(c.equals(p));

我强烈建议您阅读以下内容中的“陷阱#3:根据可变字段定义相等项”部分:

如何用Java编写平等方法

一些其他链接:

  • 实现hashCode()和equals()
  • 优美的博客-值,等于和哈希码

哦,仅出于后代考虑,无论您选择比较哪些字段来确定相等性,都需要在

hashCode
计算中使用相同的字段。
equals
并且
hashCode
必须是对称的。如果两个对象相等,则它们 必须 具有相同的哈希码。相反不一定是正确的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414511.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号