读书笔记-Effective Java(类和接口)
15.使类和成员的可访问性最小化
组件可以独立地开发,加快了系统开发的速度,公有类不应该包含公有域。
16. 要在公有类而非公有域中使用访问方法
17.使可变性最小化
类的不可变遵循五条规则:
- 不要提供任何会修改对象状态的方法
- 保证类不会被拓展
- 声明所有的域都是final的
- 声明所有的域都是私有的
- 确保对于任何可变组件的互斥访问
18.复合先于继承
包内部使用继承非常安全,包外继承则非常危险。继承打破了封装性。这样做带来的问题就是,如果父类有几个相同性质的方法,而子类要对这类性质的方法进行覆盖,如果后续父类对这类性质的方法进行了拓展或增加,子类就必须同步进行修改。使用复合方法,即在拓展类中引用现有类的一个实例。只有当子类和超类之间确实存在子类型关系时,使用继承才是恰当的。
19.要么设计继承并提供文档说明,要么禁止继承
构造器绝不能调用可被覆盖得方法,这是因为子类覆盖的方法将会在子类的构造器运行之前先被调用,如果该覆盖方法依赖于子类构造器所执行的任何初始化工作,该方法将不会如预期般执行。
对于那些并非为了安全地进行子类化而设计和编写文档的类,要禁止子类化。有两种方法禁止子类化,一种是把这个类声明为final的,一种是把所有的构造器私有化,或者包级私有,并增加一些公有的静态工厂来代替构造器。
20.接口优于抽象类
如果你导出了一个重要接口,就应该坚决考虑同时提供骨架实现类。而且,还应该尽可能地通过缺省方法在接口中提供骨架实现,以便接口的所有实现类都能使用。
21.为后代设计接口
添加缺省的方法
22.接口只用于定义类型
接口只应该用于定义类型,而不能用于导出常量
23.类层次优于标签类
标签类过于冗长,容易出错,并且效率低下,标签类真是对类层次的一种简单的仿效。类层次的一个好处就是,它们可以用来反映类型之间本质上的层次关系,有助于增强灵活性,并有助于更好地进行编译时类型检查。
24.静态成员类优于非静态成员类
- 静态成员类:最简单的一种嵌套类。最好看作普通类,只是碰巧被声明在另一个类的内部而已。常见用法是作为公有的辅助类,
25.限制源文件为单个顶级类
不要把多个顶级类或者接口放到同一个源文件中,否则程序的行为将受源文件传输给编译器的顺序的影响。