1、好的设计模块与坏的设计模块
- 是否隐藏内部数据和其他实现细节
- API与实现,清晰隔离开
- 模块之间通过API通信
- 信息隐藏或封装是软件设计的基本原则之一
2、信息隐藏非常重要
- 可以有效地解除系统各个模块之间的耦合关系
- 使得各个模块独立开发、测试、优化、使用、理解、修改
- 加快系统开发速度
- 减少维护负担
3、信息隐藏本身不会带来好的性能,但是可以有效调节
- 一旦系统完成,可以分模块性能测试,确定影响性能模块,单独优化
4、信息隐藏提高了软件的可重用性
- 降低了构建大型系统风险
- 即使整个系统不可用,有些独立模块也是可用的
5、java 提供了许多机制来协助隐藏信息
- 访问控制,决定了类、接口和成员的可访问性
- 实体的可访问性由其声明所在的位置,以及实体声明中所出现的访问修饰符共同决定
- 正确使用这些修饰符对信息隐藏非常关键
6、第一规则:尽可能使每个类或成员不被外界访问
- 应该写与你所编写内容一致,尽可能小的访问权限
7、对于顶层的类(非嵌套类)和接口,只有两种可能的访问级别
- 包级私有:非public 修饰,成为实现的一部分,内部修改优化,外界不感知
- 公有:public 修饰,API一部分,有责任一直维护,以保持兼容
8、一个顶层包级私有类,如果仅仅在一个类的内部被使用到
- 考虑让其成为内部嵌套类
9、降低不必要公有类的可访问性,比降低包级私有顶层类更重要的多
- 因为公有类是API的一部分
10、对于成员(域、嵌套类、嵌套接口、方法),有四中访问级别
- 私有、包级私有是实现的一部分,不应该影响导出的API
(1)私有的(private):只有在声明该成员的顶层类内部才可访问
(2)包级私有(缺省修饰符):声明该成员的包内部的任何类都可以访问
(3)受保护的(protected):声明该成员类的子类可以访问,包内部也都可以访问
(4)公有的(public):任何地方都可以访问
11、公有类的成员,从私有变成保护级别,会大大增强可访问性
- 保护成员是其导出API一部分,必须一直支持
- 受保护成员也成了该类对某个实现细节的公开承诺,
- 受保护成员尽量少用
12、如果一个方法覆盖了父类的一个方法,子类的访问级别就不能低于超类的访问级别
- 违反该规则,编译器会报错
- 如果一个类实现了一个接口,那么所有接口方法,类都要声明为公有的
- 接口种方法都隐含着公有访问级别
13、实例域绝不能是公有的
- 包含公有可变域的类并不是线程安全的
- 即使域是final 的,并且引用不可变对象
- 当这个域变成公有的时候,就放弃了“切换到内部数据表示法”的灵活性
- 同样的情况,适用于静态域
- 例外:常量构成类提供的整个抽象的一部分,可以使用静态final 域暴漏他们
- 上述例外:大写字母,下划线分割,要么引用基本类型值,要么不可变类对象
- 如果引用可变对象,即便final 修饰,其他地方可以修改、灾难后果
14、长度非零的数组是可变的
- 类具有的公有final 数组域、返回这种域的访问方法,几乎都是错的
- 如果类具有这样的域或访问方法,客户端可以访问修改数组中的内容(常见安全漏洞)
- 解决上述漏洞:
- 备份解决:
两种解决方案,要考虑客户端如何使用结果、怎么方便、性能高来进行选择