4.1 使类和成员的可访问性最小化
要区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来,然后模块之间只通过API进行通信,一个模块不需要知道其他模块内部的工作情况,这个概念被称为信息隐藏或封装,是软件设计的基本原则之一。
4.2 在公有类中使用访问方法而非公有域
坚持面向对象程序设计思想:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的内部信息表示法的灵活性。
4.3 使可变性最小化
不可变类只是其实例不能被修改的类。
存在不可变类有许多理由:不可变类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。
为了使类变成不可变,要遵循下面五条规则:
(1)不要提供任何会修改对象状态的方法;
(2)保证类不会被扩展;为了防止子类化,一般做法是使这个类称为final的。
(3)使所有的域都是final的;
(4)使所有的域都成为私有的;
(5)确保对于任何可变组件的互斥访问。
4.4 复合优先于继承
4.5 要么为继承而设计,并提供文档说明,要么就禁止继承
4.6 接口优先于抽象类
现有的类可以很容易被更新,以实现新的接口;
接口是定义mixin(混合类型)的理想选择;
接口允许我们构造非层次结构的类型框架。
4.7 接口只用于定义类型
4.8 类层次优于标签类
4.9 用函数对象表示策略
4.10 优先考虑静态成员类