mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2024-12-28 22:01:01 +08:00
Update 10. 重写equals方法时遵守通用约定.md
This commit is contained in:
parent
21680a3164
commit
52ccfe71a4
@ -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(例如 Eclipse,NetBeans,IntelliJ IDEA 等)也有生成 equals 和 hashCode 方法的功能,但是生成的源代码比使用 AutoValue 框架的代码更冗长、可读性更差,不会自动跟踪类中的更改,因此需要进行测试。这就是说,使用 IDE 工具生成 equals(和 hashCode) 方法通常比手动编写它们更可取,因为 IDE 工具不会犯粗心大意的错误,而人类则会。
|
||||
|
||||
总之,除非必须:在很多情况下,不要重写 equals 方法,从 Object 继承的实现完全是你想要的。 如果你确实重写了 equals 方法,那么一定要比较这个类的所有重要属性,并且以保护前面 equals 约定里五个规定的方式去比较。
|
||||
总之,除非必须:在很多情况下,不要重写 equals 方法,从 Object 继承的实现完全是你想要的。 如果你确实重写了 equals 方法,那么一定要比较这个类的所有重要属性,并且以保护前面 equals 约定里五个规定的方式去比较。
|
||||
|
Loading…
Reference in New Issue
Block a user