第十三条:使类和成员的可访问性最小化

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

设计良好的模块会隐藏所有色实现细节,把它的API与它的实现清晰地隔离开来。模块之间只通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况。这个概念被称为信息隐藏(information hiding)或封装(encapsulation),是软件设计的基本原则之一。

信息隐藏可以有效地解除组成系统的各模块之间的耦合关系,使这些模块可以独立地开发、测试、优化、使用、理解和修改。

Java程序设计语言提供了许多机制来协助信息隐藏。访问控制机制决定了类、接口和成员的可访问性。实体的可访问性是由该实体声明所在的位置,以及该实体声明中所出现的访问修饰符(private、protected和public)共同决定的。

  1. 尽可能地使每个类或者成员不被外界访问。
  2. 对于顶层(非嵌套的)类和接口,只有两种可能访问的级别:包级私有的(package-private)和公有的(public)。

如果一个包级私有的顶层类(或者接口)只是在某一个类的内部被用到,就应该考虑使它成为唯一使用它的那个类的私有嵌套类。

对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别:

  • 私有的(private)——只有在声明该成员的顶层类内部才可以访问这个成员。
  • 包级私有的(package-private)——声明该成员的包内部的任何类都可以访问这个成员。它被称为“缺省(default)访问级别”,如果没有为成员指定访问修饰符,就采用这个访问级别。
  • 受保护的(protected)——声明该成员的类的子类可以访问这个成员,并且声明该成员的包内部的任何类也可以访问这个成员。
  • 公有的(public)——在任何地方都可以访问该成员。

有一条规则限制了降低方法的可访问性的能力。如果方法覆盖了超类中的一个方法,子类中的访问级别就不允许低于超类中的访问级别。这样可以确保任何可使用超类的实例的地方都可以使用子类的实例。

如果一个类实现了一个接口,那么接口中所有的类方法在这个类中也都必须被声明为公有的,因为接口中的所有方法都隐含着公有访问级别。

实例域决不能是公有的。包含公有可变域的类并不是线程安全的。