zoukankan      html  css  js  c++  java
  • 第十三条:使类和成员的可访问性最小化

    要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。

    设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来。然后,模块之间只通过它们的API进行通信,一个模块不需要

    知道其他模块的内部工作情况。这被称为信息隐藏或者封装。

    由于我们实现了很好的封装,只提供若干的API供客户端代码来访问,非API涉及的类和成员,客户端代码是无法直接使用的,这样我们在修改

    这些非API涉及的类和成员,我们就不用担心客户端代码使用了它们,造成我们修改了这些代码,从而影响了客户端代码的行为。总之一句话,

    合理的使用封装,为模块之间的松耦合而努力。

    访问控制机制(access mode)决定了类,接口,成员的可访问性。正确的使用访问修饰符,对于实现信息隐藏是非常关键的。

    第一条规则:尽可能使每个类和成员不被外界访问。尽可能使用最小的访问级别。

      对于类和接口,只有两种可能的访问级别:包级私有的和公有的。使用public修饰符声明了类和接口,那么这个类和接口就是公有的;如果省略

    public,那么这个类就是包级私有的。通过把类或者接口做成包级私有的,它实际上成了这个包的实现的一部分,而不是该包导出的API的一部分。

    以后对它的修改,只需要担心这个包内的其他类对它的使用,而不用担心客户端代码对它的使用。特别,如果一个类只是在某一个类的类的内部

    被使用到,那么我们可以考虑将这个类做成需要它的类的私有嵌套类(私有内部类),而不是包级私有类,这样就进一步降低了访问级别。

      对于成员(五类:域,初始化块,构造器,方法,内部类、内部接口),有四种可能的访问级别:

    私有的                 private

    包级私有的            缺省

    受保护的              protected

    公有的                 public

    应该把所有其他的成员都变成私有的,只有当同一个包中的另一个类真正需要访问一个成员时,才应该删除private修饰符,使该成员变成包级私有的。

    从包级私有变成受保护的 ,会大大增强这个成员的可访问性。受保护的成员应该尽量少用。

    实例域(非static的域)决不能是公有的。如果域是非final的,或者域是final的,但是引用的是一个可变对象,那么这个域一旦成为公有的,就放弃了

    对存储在这个域中的值进行限制的能力。包含公有可变域的类并不是线程安全的。

    对于静态域也建议尽量少使用公有的。但是一种情况除外,如果这个类提供了一些常量,那么可以通过公有的静态final域来暴露这些常量。通常,这些域

    的名称由大写字母组成,单词之间下划线隔开。但是这些公有的静态final域,要么是基本类型的值,要么引用不可变对象的引用。如果final域指向的是可变

    对象的引用,那么它就具有非final域的所有缺点,虽然引用本身不能被修改,但是它引用的对象却可以被修改-----这将导致灾难性的后果。

  • 相关阅读:
    解决ssh连接linux系统特别慢的问题
    mysql的InnoDB 数据库引擎TableSpace Exists 问题
    nextcloud私有云盘的部署
    su: 无法设置用户ID: 资源暂时不可用
    oracle静默安装
    mysql update 子查询锁表问题
    mysql导出数据很快,导入很慢
    mysql千万级数据库插入速度和读取速度的调整
    django, CentOS7+nginx(apache)+mod_wsgi+Python+Django
    javascript 重写已有的方法
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4459483.html
Copyright © 2011-2022 走看看