对于所有对象都通用的方法

第八条:覆盖equals时请遵守通用约定

Object的equals()的规范【JAVASE6】:

  1. 自反性。对于任何非null的引用值x,x.equals(x)必须返回true。
  2. 对称性,对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。
  3. 传递性。x,y,z,如果x.equals(y)为true,y.equals(z)为true,那么x.equals(z)必须为true
  4. 一致性。引用值x和y,未修改,多次调用x.equals(y),结果必须一致
  5. 对于任何非null的引用值x,x.equals(null)必须返回false.

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

  1. 使用==操作符检查“参数是否为这个对象的引用”
  2. 使用instanceof操作符检查“参数是否为正确的类型”
  3. 把参数转换成正确的类型
  4. 对于该类中的每个”关键”域,检查参数中的域是否与该对象中对应的域相匹配
  5. 当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的
  6. 覆盖equals时总要覆盖hashCode()
  7. 不要企图让equals方法过于智能
  8. 不要将equals声明中的Object对象替换为其他的类型
第九条:覆盖equals时总要覆盖hashCode
  1. 因没有覆盖hashCode而违反的关键约定是第二条:相等的对象必须具有相等的散列码(hash code)。
  2. 不要试图从散列码计算中排除掉一个对象的关键部分提高性能。虽然这样得到的散列函数运行起来可能更快,但是他的效果不见得会好,可能导致散列表慢到根本无法使用。
 public class PhoneNumber{
    private int a;
    private int b;
    private vlatile int hashCode;//缓存hashcode

    public int hashCode(){
        int result=hashCode;
        if(result==0){
            reuslt=17;
            result=31*result+a;
            result=31*result+b;
            hashCode=result;
        }
        return result;
    }   
 }
第十条:始终要覆盖toString
  1. 在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息。
  2. 无论你是否决定指定格式,都应该在文档中明确地表明你的意图。
第十一条:谨慎地覆盖clone
  1. 如果你覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone而得到的对象。
  2. 实际上,对于实现了Cloneable的类,我们总是期望它也提供一个功能适当的公有的clone()方法。
  3. clone方法就是另一个构造器;你必须确保它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。
  4. 最好提供某些其他的途径来代替对象拷贝,或者干脆不提供这样的功能5.
  5. 另一个实现对象拷贝的好方法是提供一个拷贝构造器
第十二条:考虑实现Comparable接口
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值