zoukankan      html  css  js  c++  java
  • Effective Java 3:对于所有对象都通用的方法

    第三章:对于所有对象都通用的方法
    第一条:覆盖equals方法请遵守通用的约定
    在下面中可以不考虑覆盖equals方法:
    (1).类的每个实例本质上是唯一的 枚举类型
    (2).不关心类是否提供了逻辑相等,的测试功能
    (3).超类已经覆盖了equals,从超类继承过来的行为对于子类也是适合的,
    (4).类是是私有的或包含所有的,
    实现equals方法要实现的等价关系:
    自反性,对称性,传递性,一致性
    里式替换原则(lis substitution principle),一个类的任何重要的属性也适用与他的子类型
    复合优于继承
    (5).非空性:所有的对象都不必须不等于null,
    public boolean equals(Object o){
    if (!(o instanceof MyType))
    return false;
    Mytype e=()o;
    }
    如果把null传给equals方法,类型就会返回false,所以不需要单独的null检查

    实现高质量的equals方法诀窍:
    (1).使用==操作符检查参数是否为这个对象的引用
    这个是性能优化,如果equals操作非常昂贵就可以考虑这么做
    (2).使用instanceof检查参数是否是正确的类型
    (3).把参数转化为正确的类型
    (4).对于该类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配
    基本类型,引用类行,double,float比较注意,数组比较每一个,
    比较域时,选择尽可能多的不一直的域,或者开销最低的域;不要去比较不属于对象逻辑做太的域
    (5).注意当编写完equals时,应该问自己三个问题,是否对称,是否传递,一致
    告诫:
    (1)。覆盖equals重要覆盖hashcode()
    (2)。不要企图让equals方法过于智能
    (3)。不要将equals声明中的Object对象替换为其他的类型


    第九条:覆盖equals时,总要覆盖hashCode()方法
    因为:相等的对象必须要有相等的散列码
    方法:计算散列码:方法---------:注意把冗余域排除,就是equals中没有用到的域,但是不要试图从散列码中排除任意一个对象的关键部分来提高性能,计算hashCode值时,注意添加优化,可以避免重复计算
    第十条:始终覆盖toString()方法
    toString()方法应该返回对象中包含的所有值关注的信息
    第十一条:谨慎的覆盖clone方法
    第十二条:考虑实现Comparable接口
    一旦实现该接口可以和很多泛行算法算法结合使用
    注意比较基本类型用<>,比较double float 用Float.compare double.compare,对于数组用到每一个元素

  • 相关阅读:
    第8章 对象的容纳
    第 4 章 初始化和清除
    第 3 章 控制程序流程
    maven教程
    使用Eclipse构建Maven项目 (step-by-step)
    将 Maven生成的java项目转化为支持 Eclipse IDE的项目
    eclipse 中修改 M2_REPO的值
    FilenameUtils工具类
    导出excel小结(C#,.NET,Wpf)
    NPOI导出Excel表功能实现(多个工作簿)(备用)
  • 原文地址:https://www.cnblogs.com/csxf/p/3283011.html
Copyright © 2011-2022 走看看