第15项:使类和成员的可访问性最小化

  要区分精心设计的组件和设计不好的组件的最重要的因素在于,这个组件对于其他组件而言,是否隐藏了其内部数据和其他市县细节。设计良好的组件会隐藏其所有实现细节,把它的API与它的实现完全分离。组件之间只能通过它们的API进行通信,并且不知道彼此之间内部的工作细节。这种被称为信息隐藏(information hiding )或封装(encapsulation)的概念是软件设计的基本原则[Parnas72]。

  信息隐藏之所以非常重要是有许多原因的,其中大部分原因在于它将构成系统的组件解耦,允许它们单独开发、测试、优化、使用、理解和修改。这样可以加快系统开发的速度,因为这些组件可以并行开发。它也减轻了维护的负担,因为程序猿可以更快地理解、调试或者更换组件,而不用担心会影响其他组件。虽然信息隐藏本身无论是对内还是对外,都不会带来更好的性能,但是它可以实现有效的性能调优:一旦系统完成,并通过分析确定了哪些组件影响了系统的性能(第67项),那些组件可以在不影响正确性的情况下对其他模块进行优化。信息隐藏提高了软件的可重用性,因为组件之间的耦合度低,除了开发这些组件所使用的环境之外,他们在其他的环境中往往也很有用。最后,信息隐藏也降低了构建大型系统的风险,因为即使整个系统不可用,这些独立的组件有可能是可用的。

  Java有许多机制(facilities)来协助信息隐藏。访问控制机制(access control)机制[JLS, 6.6]制定了类、接口和成员的可访问性。实体的可访问性由其声明的位置确定,以及声明中出现的访问修饰符(private、protected和public)共同决定的。正确地使用这些修饰符对于信息隐藏至关重要。

  经验法则很简单:尽可能使每个类或者成员不被外界访问。 换句话说,使用与你正在编写的软件的正常功能相一致的、尽可能低的访问级别。

  对于顶层(非嵌套的)的类和接口,只有两种可能的访问级别:包私有(package-private)和公有的(public)。如果你用public修饰符声明了顶层类或者接口,那它就是公有的;否则,它将是包私有的。如果一个顶级类或者接口能够设置成包私有,它【的访问级别】就应该是包私有的。通过把类或者接口设置成包私有,你把它做成了实现的一部分而不是导出的API,在之后的发行版本中,可以对它进行修改、替换,或者删除,而无需担心会影响到现有的客户端。如果你把它做成公有的,你就有义务永远支持它,以保持它们的兼容性。

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

  对于成员(字段、方法、前套类和嵌套接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来:

  • 私有的(private) ———— 只有在声明该成员的顶层类内部才可以访问这个成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值