《Effective JAVA》第二篇
为了更好地可拓展性,JAVA提供了Object类作为所有类的父类,Object类拥有一系列所有类都可能用到的方法,而这些方法并非明确的,需要被覆盖以实现具体功能。而在具体实现这些方法的时候,由于其自由度较高,我们需要一些约定来保证其对于其他类的可见度。
首先,equals方法作为一个尤为普遍的方法,我们常常需要用到。如何判断某个类的实例是否相等?这不像简单的数字之间是否相等,又或是稍复杂字符(串),一个类包括简单的成员变量,但同时也包含成员方法。最简单的方法是不覆盖equals,equals具有自反性,对称性,传递性,一致性,前三个与离散数学中的”=”定义相同,最后一个是对于程序自身的要求。同时,在我们覆盖equals方法的时候,需要相应的覆盖hashCode方法,来保证该类可以结合所有基于散列的集合一起正常工作,包括HashMap、HashSet以及Hahtable。
其次,toString 方法建议所有子类都要覆盖。Object类虽然提供了它的一个实现,但返回值并非我们需要的,我们需要其反馈一个简洁,信息量丰富的值。这个需求并非强制性的要求我们这样去覆盖toString方法,也不会产生fatal error,但是会让实现这样的方法的类拥有更好的使用体验。
然而对于clone方法而言,实现后将带来许多问题,其他的接口都不应该拓展这个接口,为了继承而设计的类也不应该去实现该接口,除了数组拷贝,有经验的程序员从来不去调用clone方法,也就不必去实现它。如果没有办法很好地保护clone方法,就不要去轻易去尝试实现它。
对于comparable接口,实现具有局限性,需要保证相关域的范围,否则会导致错误的返回值,比如两个三十二位整数的差值可能大于一个有符号的三十二位整数,从而可能带来越界等问题,而这个接口并非必须的,仅仅是方便了我们的使用,所以在明确知道相关域的范围符合要求的时候,使用这项技巧能带来意外惊喜,否则不要让它成为你的负担。
参考书籍《Effective JAVA》
#Java#