13 使类和成员的可访问性最小化

时间:2022-02-04 04:22:09

  要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来。

  信息隐藏之所以非常重要有许多原因,其中大多数理由都源于这样一个事实:它可以有效的解除组成系统的各个模块之间的耦合关系,使得这些模块可以独立地开发、测试、优化、使用、理解和修改。

  第一个规则很简单:尽可能地使每个类或者成员不被外界访问。

  对于顶层的(非嵌套)的类和接口,只有两种可能的访问级别:包级私有的(package-private)和公有的(public)。如果类或者接口能够被做成包级私有的,它就应该被做成包级私有。

  如果一个包级私有的顶层类(或者接口)只是在某一个类的内部被用到,就应该考虑使它成为唯一使用它的那个类的私有嵌套类。这样可以将它的可访问范围从包中的所有类缩小到了使用它的那个类。然而,降低不必要公有类的可访问性,比降低包级私有类的顶层类更重要的多:因为公有类是包的API的一部分,而包级私有的顶层类则已经是这个包的实现的一部分。

  如果方法覆盖了超类中的一个方法,子类中的访问级别就不允许低于超类中的访问级别。

  实例域决不能是公有的。如果域是非final的,或者是一个指向可变对象的final引用,那么一旦使这个域成为公有的,就放弃了对存储在这个域中的值进行限制的能力;这意味着,你也放弃了强制这个域不可变的能力。