![]() |
1
1393
该理论(适用于语言律师和数学爱好者):
这个 关系 这两种方法之间的区别是:
在实践中:如果你覆盖了一个,那么你应该覆盖另一个。
使用与计算相同的字段集
使用优秀的助手课程 EqualsBuilder 和 HashCodeBuilder 从 Apache Commons Lang 图书馆。举个例子:
还要记住:当使用基于哈希的 Collection 或 Map 例如 HashSet , LinkedHashSet , HashMap , Hashtable ,或 WeakHashMap ,确保您放入集合中的键对象的hashCode()在对象在集合中时永远不会改变。确保这一点的防弹方法是使您的密钥不可变, which has also other benefits . |
![]() |
2
284
如果您不认为这已经变得异常复杂,那么如果您正在处理使用Hibernate等对象关系映射器(ORM)持久化的类,则有一些问题值得注意! 延迟加载的对象是子类
如果您的对象是使用ORM持久化的,在许多情况下,您将处理动态代理,以避免过早地从数据存储中加载对象。这些代理被实现为您自己类的子类。这意味着
如果您正在处理ORM,请使用
延迟加载的对象具有空字段
ORM通常使用getter来强制加载延迟加载的对象。这意味着
如果您正在处理ORM,请确保始终使用getter,并且永远不要在
保存对象将更改其状态
持久对象通常使用
我经常使用的一个模式是
但是:你不能包括
在我的
|
![]() |
3
82
关于
此声明是以下内容的结果
考虑以下示例,说明省略语句时会发生什么:
所作所为
这看起来都很好,但看看如果我们尝试使用这两个类会发生什么:
显然,这是错误的。
如果你想确保对称条件。如果b=a,则a=b,并调用Liskov替换原理
这将输出:
在哪里,如果
|
![]() |
4
43
对于继承友好的实现,请查看Tal Cohen的解决方案, How Do I Correctly Implement the equals() Method? 摘要: 在他的书中 Effective Java Programming Language Guide (Addison-Wesley,2001),Joshua Bloch声称“根本不可能在保持相等契约的同时扩展一个可实例化类并添加一个方面。”Tal不同意。 他的解决方案是通过双向调用另一个非对称的blindlyEquals()来实现equals()。blindlyEquals()被子类覆盖,equals()被继承,从不被覆盖。 例子:
请注意,equals()必须跨继承层次结构工作,如果 Liskov Substitution Principle 就是要满足。 |
![]() |
5
31
仍然惊讶的是,没有人为此推荐番石榴图书馆。
|
![]() |
6
26
超类中有两个方法java.lang.Object。我们需要将它们重写为自定义对象。
只要相等,相等的对象就必须产生相同的哈希码,但不等的对象不需要产生不同的哈希码。
如果你想获得更多,请查看此链接 http://www.javaranch.com/journal/2002/10/equalhash.html 这是另一个例子, http://java67.blogspot.com/2013/04/example-of-overriding-equals-hashcode-compareTo-java-method.html 玩得开心 @.@ |
![]() |
7
18
在检查成员相等性之前,有几种方法可以检查类相等性,我认为这两种方法在适当的情况下都很有用。
我在a中使用#1
选项#2允许在不重写equals或破坏对称性的情况下安全地扩展类。
如果你的班级也是
|
![]() |
8
15
对于平等者,请查看 Secrets of Equals 靠近 Angelika Langer 我非常喜欢它。她也是一个很好的FAQ Generics in Java .查看她的其他文章 here (向下滚动到“Core Java”),她还继续介绍了第2部分和“混合类型比较”。祝你阅读愉快! |
![]() |
9
11
equals()方法用于确定两个对象的相等性。 因为int值10总是等于10。但是这个equals()方法是关于两个对象的相等。当我们说object时,它将具有属性。为了决定是否相等,我们考虑了这些属性。没有必要考虑所有属性来确定相等性,并且可以根据类定义和上下文来决定相等性。然后可以重写equals()方法。 每当我们重写equals()方法时,我们都应该重写hashCode()方法。如果没有,会发生什么?如果我们在应用程序中使用哈希表,它将不会按预期运行。由于hashCode用于确定所存储值的相等性,因此它不会为键返回正确的对应值。 给出的默认实现是Object类中的hashCode()方法,该方法使用对象的内部地址并将其转换为整数并返回。
示例代码输出:
|
![]() |
10
7
从逻辑上讲,我们有:
但是 不 反之亦然! |
![]() |
11
6
我发现的一个问题是,两个对象包含对彼此的引用(一个例子是父/子关系,父上有一个方便的方法来获取所有子对象)。
如果在hashCode或equals测试中包含关系的两端,则有可能进入以StackOverflowException结尾的递归循环。
|