每个对象包含了自身的状态和行为。行为能够通过接口导出。
- class just as template for objects
- class隐式对应着一个接口
- OO特性-1: 通过相同的接口动态分发
- 能够支持单个接口的多实现
- 接口有助于信息隐藏
- OO特性-2: 信息隐藏(encapsulation)
- class level: java通过访问修饰符,js通过闭包实现
- file level: js通过modules实现
Item 15: Minimize the accessibility of classes and members
仔细考虑类以及类成员的可访问性。
- 对于类: 顶层类只可能为
public
或package-private
。当顶层类声明为public
时,它成为了API的一部分。 - 对于类内的成员
- field: 除了
public static final
域,其余实例域都应该声明为非公共 - method: 最小化可访问性
protected
: 同一包内或子类后代能够访问。因此protected
成员也是类导出API的一部分。该修饰符应当很少被使用。
- 子类访问能力的修改
- 子类成员不应有比父类成员弱的访问能力: 目的在于保证任何基类可拥有的行为,子类也能有(里氏替换法则)
- 注意: 为了测试,能够接受将私有成员声明为
package-private
成员,但是不能接受将它们作为package的导出API
- field: 除了
Item 16: In public classes, use accessor methods, not public fields
- 公共类: 永远不应当暴露可变域,对于不可变域,尽量不要暴露。
- 对域使用
private
,并通过公共的getter
和setter
导出。这样就隐藏了底层实现,并能更好地施加不变式等。
- 对域使用
package-private
类和私有嵌套类: 可以直接使用公共域