Android开发经验谈Android技术知识Android进阶之路

《Effective Java》学习笔记 第三章 对于所有对象都

2019-05-28  本文已影响3人  WangGavin
龙女王登基

1 覆盖equals时请遵守通用约定

覆盖equals方法看起来似乎很简单,但是许多覆盖方式会导致错误,并且后果非常严重,最容易避免该问题的办法就是不覆盖equals方法,这种情况下,类的每个实例都只与它自身相等
如果满足了一下任何一个条件,就符合期望

1.1 什么时候要覆盖equals方法?

如果类具有自己的逻辑相等概念(我看做值或者内容相等,不是引用相等),而且超类还没有覆盖equals以实现期望的行为,这是需要覆盖equals方法。
有一种“值类”不需要覆盖equals方法,枚举类型就属于这种类。

在覆盖equals方法的时候,必须遵守它的通用约定

因为在一些业务场景中,许多集合类都依赖于传递给它们的对象是否遵循了equals约定。如果你违反了它们,就会发现你的程序会表现得不正常。

实现高质量equals方法得诀窍:

2 覆盖equals方法时总要覆盖hashCode

一些很常见的错误根源就是没有覆盖hashCode方法,在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,比如HashSet,HashMapHashTable

2.1 Object.hashCode约定内容

我自己用一句话来说就是:两对象内容相等,那么它们的散列码也必须相等

2.2 产生散列码的简单技巧

3 始终要覆盖toString

toString的通用约定:被返回的字符串应该是一个简洁的,但信息丰富的并且易于阅读的表达形式。

一般都是在值类型的类型覆盖,而且用IDEA的快捷键即可快速覆盖,一般都是返回关键域信息。

4 谨慎地覆盖clone

Coloneable接口没有任何方法,但它决定了Object总受保护地clone方法实现的行为:如果一个类实现了CloneableObjectclone方法就返回该对象的逐域拷贝,否则就会抛出CloneNotSupportedException异常

宁愿多写个静态工厂方法,也最好不要用clone方法

5 考虑实现Comparable接口

compareTo方法并没有在Object中声明。相反,它是Comparable接口中唯一的方法,类实现了Comparable接口,就表明了它的实例具有内在的排序关系,所有为实现了Comparable接口的对象排序就非常简单:Arrays.sort(a)

事实上,java平台类库中的所有值类都实现了Comparable接口,所有你正在写一个值类,如果它具有非常明显的排序关系,拿你应该坚决实现该接口。

上一篇 下一篇

猜你喜欢

热点阅读