Effective Java 系列-02 类和接口
一、类和成员的可访问性最小化
对于成员有四种可能的访问级别:
- 私有的(private) 只有再声明该成员的类内部才可以访问这个成员。
- 包级私有 声明改成员的包内部的任何类都可以访问这个成员。
- 受保护的(protected) 声明改成员的类的子类内部可以访问这个成员。
- 公有的(public) 任何地方都可以访问。
实例域不能是公有的。因为这个域被公开之后,就失去了对这个对象的限制,并有可能造成线程安全问题。
注意:长度非零的数组总是可变的,所以类具有公有的静态final数组域或者返回这种域的访问方法,这几乎总是错误的,如果类具有这种域或者访问访问,客户端将能够修改数组种的内容了,这是安全漏洞种的一个常见根源,修复这个问题有两种方式,一是返回数组转换的变为不可变列表,另一个是返回这个数组的克隆对象。
二、类的可变性最小
需要遵循下面五个原则:
- 不要提供任何会修改对象属性的方法
- 保证类不会被扩展
- 所有的域都是final的
- 所有的域都是私有的
- 确保对于任何可变组件的互斥访问。如果类具有指向可变对象的域,必须却包该类的客户端无法获得指向这些对象的引用,并且永远不要用客户端提供的对象引用来初始化这样的域,也不要从任何访问的方法种返回该对象的引用。
三、复合优于继承
继承会打破类的封装性。
继承由于超类的更新有可能会破坏现有子类的安全性。
使用复合可以解决上述问题,也称为包装模式。复合的类称为原类的包装类。
在新类种增加一个私有域,引用现有类的实例,新类种的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回它的结果。
使用包装模式,可以对现有类的进行功能上的增强。
在开发中优先考虑复合,实现对超类的方法增强。