你是人间的四月天
第三章 对于所有对象都通用的方法
- 八. 覆盖equals时请遵守通用约定
- equals方法实现的等价关系: 自反性,对称性,传递性,一致性
- 九.覆盖equals时总要覆盖hashCode
- 相等的对象必须具有相等的散列码(hashcode)
- 不等的对象散列码可能相等,但最佳实践是”为不相等的对象产生不相等的散列码”
- 十. 始终要覆盖toString方法
- 十一. 谨慎地覆盖clone
- 十二. 考虑实现Comparable接口
- 如果在编写一个值类,具有非常明显的内在排序关系,如按照字母排序,按数值排序,按年代排序,那应该坚决考虑实现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.确保对于任何可变组件的互斥访问
- 不可变对象本质上是线程安全的,它们不要求同步
- 1. 不要提供任何会修改对象状态的方法
- 十六. 复合优先于继承
- 十七. 要么为继承而设计,并提供文档说明,要么就禁止继承
有两种方法可以禁止子类化:
- 较容易的:把该类声明为final
- 把所有的构造器都变成私有的,或者包级私有的,并增加一些公有的静态工厂来替代构造器
- 较容易的:把该类声明为final
- 十八. 接口优于抽象类
- 十九. 接口只用于定义类型
- 二十. 类层次优于标签类
- 标签类过于冗长,容易出错,并且效率低下。
二一. 用函数对象表示策略
- 具体的策略类往往使用匿名类声明,下面的语句根据长度对一个字符串数组进行排序:
Arrays.sort(stringArray,new Comparator<String>(){ public int compare(String s1,String s2){ return s1.length() - s2.length(); } } )
注意,采用上述方式使用匿名类时,将会在每次执行调用的时候创建一个新的实例。如果它被重复执行,考虑将函数对象存储到一个私有的静态final域里,并重用它。这样做的另一种好处是,可以为这个函数对象取一个有意义的域名城。
- 具体的策略类往往使用匿名类声明,下面的语句根据长度对一个字符串数组进行排序:
二二. 优先考虑静态成员类
- 嵌套类是指被定义在另一个类的内部的类。嵌套类存在的目的应该只是为它的外围类提供服务。嵌套类有四种:静态成员类、非静态成员类、匿名类、局部类