类和成员可访问性最小化

区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和实现细节,这就是软件设计的基本原则之一 ---封装

封装的原因

  • 有效的解除组成系统的各个模块之间的耦合,使得这些模块可以独立的进行开发,测试,优化等
  • 加快开发速度,各个模块之间可以并行的开发
  • 可以有效的调节性能:一旦完成了系统,并通过剖析确定哪些模块影响了性能,就可以针对模块进行优化。
  • 降低构建大型系统的风险,其中一个模块出现问题,不会影响其他模块的正确性

四种访问级别(递增):

  • 私有(private)——只有在本类中才能访问
  • 包级私有 ——声明该成员的包内部的任何类都可以访问,如果没有指定访问修饰符,就采用这个访问级别(default)
    -受保护的(protected)——该成员的类的子类可以访问
    -公有的(public )——任何地方都可以访问

规则

  • 尽可能地使每个类或者成员不被外界访问,对于顶层的类和接口,只有两种可能的访问级别,包级私有(package-private)或者公有(public),如果被设计成包级私有的,那么该类就应该是就应该是包的实现的一部分,而不是该包导出的api的一部分,以后对它进行修改替换等操作,无需担心会影响到客户端。另外如果一个包级私有类只在某一个类的内部被用到,那么就应该考虑使他成为唯一使用它的那个类的嵌套类,这样就使得类从包级私有变成,使用它的那个类私有

  • 受保护的成员应该尽量少用,当访问级别从包级私有变成受保护的,那么会大大的增加可访问性,受保护的成员是类的导出的api的一部分,必须永远得到支持

  • 如果方法覆盖了超类中的一个方法,子类中的访问级别就不允许低于超类中的访问级别,这样可以确保,任何可以使用超类的实例的地方都可以使用子类的实例,如果违反了这条规则,编译会出错

  • 实例域决不能是公有的。如果域是非final的,或者是一个指向可变对象的final引用,那么一旦使这个域成为公有的,就放弃了对存储在这个域中的值进行修改的能力,这意味着,也就放弃了强制这个域不可变的能力。同时,当这个域被修改的时候,你也就失去了对它采取任何行动的能力。因此,包含公有可变域的类并不是线程安全的。只是有一种例外情况。假设常量构成了类提供的整个抽象中的一部分,可以通过公有的静态final域来暴露这些常量。

  • 注意:长度非零的数组总是可变的,所以,类具有公有的静态final数组域,或者返回这种域的访问方法,这总是错误的。如果类具有这样的域或者访问方法,客户端将能够修改数组中的内容。这是安全漏洞的一个常见根源。

 //Potential security hole! 潜在的安全漏洞
    public static final Thing[] VALUES = {...... }

你可能感兴趣的:(类和成员可访问性最小化)