Skip to content

Commit f4f868c

Browse files
committed
update Article 8 for Effective Java
1 parent 463cbfc commit f4f868c

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

docs/effective-java.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ equals 方法实现了等价关系(`equivalence relation`):
558558

559559
- **传递性(`transitive`**。对于任何非 null 的引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 也返回 true,那么 x.equals(z) 也必须返回 true。
560560

561-
- **一直性`consistent`**。对于任何非 null 的引用值 x 和 y,只要 equals 的比较操作在对象中所用的信息没有被修改,多次调用 x.equals(y) 就会一致地返回 true,或者一致地返回 false。
561+
- **一致性`consistent`**。对于任何非 null 的引用值 x 和 y,只要 equals 的比较操作在对象中所用的信息没有被修改,多次调用 x.equals(y) 就会一致地返回 true,或者一致地返回 false。
562562

563563
- **非空性**。对于任何非 null 的引用值 x,x.equlas(null) 必须返回 false。
564564

@@ -836,4 +836,8 @@ public class ColorPoint {
836836

837837
```
838838

839-
需要我们记住的是:**复合优先于继承**
839+
需要我们记住的是:**复合优先于继承**
840+
841+
****一致性(`consistency`** --- equals 约定的第四个条件是,如果两个对象相等,它们就必须始终保持相等,除非它们中有一个对象(或两个都)被修改了。换句话说,可变对象在不同的时候可以与不同的对象相等,而不可变对象则不会这样。当你在写一个类的时候,应该仔细考虑它是否应该不可变的(见第 15 条)。如果类是不可变的,就必须保证 equals 方法满足这样的限制条件:相等的对象永远相等,不相等的对象永远不相等。
842+
843+
无论是否是不可变的,**都不要使 equals 方法依赖于不可靠的资源**。如果违反了这条禁令,要想满足一致性的要求就十分困难了。例如,java.net.URL 的 equals 方法依赖于对 URL 中主机 IP 地址的比较。将一个主机名转变成 IP 地址可能需要访问网络,随着时间的推移,不确保会产生相同的结果。这样会导致 URL 的 equals 方法违反 equals 约定,在实践中有可能引发一些问题。(遗憾的是,因为兼容性的要求,这一行为无法被改变。)除了极少数的例外情况,equals 方法都应该对驻留在内存中的对象执行确定性的计算。

0 commit comments

Comments
 (0)