Update 10. 重写equals方法时遵守通用约定.md

This commit is contained in:
Joe 2018-10-09 11:39:24 +08:00 committed by GitHub
parent 21680a3164
commit 52ccfe71a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,10 +27,10 @@ public boolean equals(Object o) {
当你重写 equals 方法时必须遵守它的通用约定。Object 的规范如下:
equals 方法实现了一个等价关系equivalence relation。它有以下这些属性:
- **自反性:**对于任何非空引用 x`x.equals(x)` 必须返回 true。
- **对称性:**对于任何非空引用 x 和 y如果且仅当 `y.equals(x)` 返回 true 时 `x.equals(y)` 必须返回 true。
- **传递性:**对于任何非空引用 x、y、z如果 `x.equals(y)` 返回 true`y.equals(z)` 返回 true`x.equals(z)` 必须返回 true。
- **一致性:**对于任何非空引用 x 和 y如果在 equals 比较中使用的信息没有修改,则 `x.equals(y)` 的多次调用必须始终返回 true 或始终返回 false。
- **自反性:** 对于任何非空引用 x`x.equals(x)` 必须返回 true。
- **对称性:** 对于任何非空引用 x 和 y如果且仅当 `y.equals(x)` 返回 true 时 `x.equals(y)` 必须返回 true。
- **传递性:** 对于任何非空引用 x、y、z如果 `x.equals(y)` 返回 true`y.equals(z)` 返回 true`x.equals(z)` 必须返回 true。
- **一致性:** 对于任何非空引用 x 和 y如果在 equals 比较中使用的信息没有修改,则 `x.equals(y)` 的多次调用必须始终返回 true 或始终返回 false。
- 对于任何非空引用 x`x.equals(null)` 必须返回 false。
除非你喜欢数学,否则这看起来有点吓人,但不要忽略它!如果一旦违反了它,很可能会发现你的程序运行异常或崩溃,并且很难确定失败的根源。套用约翰·多恩 (John Donne) 的说法,没有哪个类是孤立存在的。一个类的实例常常被传递给另一个类的实例。许多类,包括所有的集合类,都依赖于传递给它们遵守 equals 约定的对象。
@ -375,4 +375,4 @@ public boolean equals(MyClass o) {
很多 IDE例如 EclipseNetBeansIntelliJ IDEA 等)也有生成 equals 和 hashCode 方法的功能,但是生成的源代码比使用 AutoValue 框架的代码更冗长、可读性更差,不会自动跟踪类中的更改,因此需要进行测试。这就是说,使用 IDE 工具生成 equals(和 hashCode) 方法通常比手动编写它们更可取,因为 IDE 工具不会犯粗心大意的错误,而人类则会。
总之,除非必须:在很多情况下,不要重写 equals 方法,从 Object 继承的实现完全是你想要的。 如果你确实重写了 equals 方法,那么一定要比较这个类的所有重要属性,并且以保护前面 equals 约定里五个规定的方式去比较。
总之,除非必须:在很多情况下,不要重写 equals 方法,从 Object 继承的实现完全是你想要的。 如果你确实重写了 equals 方法,那么一定要比较这个类的所有重要属性,并且以保护前面 equals 约定里五个规定的方式去比较。