你是人间的四月天

第三章 对于所有对象都通用的方法

  • 八. 覆盖equals时请遵守通用约定
    • equals方法实现的等价关系: 自反性,对称性,传递性,一致性
  • 九.覆盖equals时总要覆盖hashCode
    • 相等的对象必须具有相等的散列码(hashcode)
    • 不等的对象散列码可能相等,但最佳实践是”为不相等的对象产生不相等的散列码”
  • 十. 始终要覆盖toString方法
  • 十一. 谨慎地覆盖clone
  • 十二. 考虑实现Comparable接口
    • 如果在编写一个值类,具有非常明显的内在排序关系,如按照字母排序,按数值排序,按年代排序,那应该坚决考虑实现Comparable接口
  public interface Comparable<T>{
  int compareTo(T t)
  }

第四章 类和接口

  • 十三. 使类和成员的可访问性最小化
    • 尽可能地使每个类或者成员不对外接访问
    • 类具有公有的静态final数组域,或者返回这种域的访问方法,这几乎总是错误的.
  • 十四. 在公有类中使用访问方法而非公有域
    java class Point { public double x; public double y; }
    正确做法应该设置为private方法,提供setter和getter方法.
  • 十五. 使可变性最小化
    为了使类成为不可变,应遵循以下五条规则
    • 1. 不要提供任何会修改对象状态的方法
    • 2. 保证类不会被扩展.一般做法是使这个类成为final
    • 3. 使所有的域都是final的
    • 4. 使所有的域都变成私有的
    • 5.确保对于任何可变组件的互斥访问
    • 不可变对象本质上是线程安全的,它们不要求同步
  • 十六. 复合优先于继承
  • 十七. 要么为继承而设计,并提供文档说明,要么就禁止继承
    有两种方法可以禁止子类化:
    • 较容易的:把该类声明为final
    • 把所有的构造器都变成私有的,或者包级私有的,并增加一些公有的静态工厂来替代构造器
  • 十八. 接口优于抽象类
  • 十九. 接口只用于定义类型
  • 二十. 类层次优于标签类
    • 标签类过于冗长,容易出错,并且效率低下。
  • 二一. 用函数对象表示策略

    • 具体的策略类往往使用匿名类声明,下面的语句根据长度对一个字符串数组进行排序:
    • Arrays.sort(stringArray,new Comparator<String>(){
      public int compare(String s1,String s2){
         return  s1.length() - s2.length();
      }  
      }
      )
    • 注意,采用上述方式使用匿名类时,将会在每次执行调用的时候创建一个新的实例。如果它被重复执行,考虑将函数对象存储到一个私有的静态final域里,并重用它。这样做的另一种好处是,可以为这个函数对象取一个有意义的域名城。

  • 二二. 优先考虑静态成员类

    • 嵌套类是指被定义在另一个类的内部的类。嵌套类存在的目的应该只是为它的外围类提供服务。嵌套类有四种:静态成员类非静态成员类匿名类局部类