要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。正确使用修饰符对于实现信息隐藏是非常关键的。

第一规则很简单:尽可能地使每个类或者成员不被外界访问。也就是说,我们应该使用与我们正在编写的软件功能相一致、尽可能最小的访问级别。

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

1)私有的(private) —只要在生命该成员的顶层类内部才可以访问这个成员。

2)包级私有的(package-private) —声明该成员的包内部的任何类都可以访问这个成员。从技术上讲,也也称为“缺省(default)访问级别”。

3)受保护的(protected)—比包私有的多了个子类可以访问。

4)公有的(public)—在任何地方都可以访问该成员。

2、实例域决不能是公有的。如果域是非final的,或者是一个指向可变对象的final引用,那么一旦使这个域成为公有的,就放弃了对存储在这个域中的值进行限制的能力。包含公有可变域的类并不是线程安全的。

同样的建议也适用于静态域。如果final域包含可变对象的引用,它便具有非final域的所有缺点。虽然引用本身不能被修改,但是它所引用的对象却可以被修改—这会导致灾难性的后果。

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

//protential security hole!
public static final Thing[] VALUES = {…};

针对上面的问题有两种修正方法。

方法一:可以使公有数组变成私有的,并增加一个公有的不可变列表。

private static final Thing[] PRIVATE_VALUES = {…};
public static finalList<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

方法二:可以使数组变成私有的,并添加一个公有方法,它返回私有数组的一个备份。

private static final Thing[] PRIVATE_VALUES = {…};
public static final Thing[]values{returnPRIVATE_VALUES.clone();
} 

第13条 类与接口——使类和成员的可访问性最小化相关推荐

  1. Effective Java之使类和成员的可访问性最小化(十三)

    对于类 对于类,只有public和package-private两种访问级别. 1.对于顶层的类来说,只有包级私有和公有两种可能,区别是包级私有意味着只能在当前包中使用,不会成为导出api的一部分,而 ...

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

    模块之间只能通过api进行通信,也就是通过暴露出来的预先定义好的函数进行通信,一个模块不需要,也不应该知道其他模块的内部工作情况,这个概念叫做信息隐藏,,也叫封装,是软件设计的重要的基本原则之一.之所 ...

  3. 类和接口的使用-类和成员可访问性最小化

    一个良好的程序设计应该是层次清晰,各模块对于外部模块来说,是否只提供了对外的API而隐藏了具体的实现细节,通常对于使用者而言,只需要知道实现功能的API 而无法操作具体实现的过程,这种设计理念被称为信 ...

  4. JCA - 核心类和接口 - Cipher类

    JCA - Cipher类 Cipher类 对称加密 VS. 非对称加密 块加密 VS. 流加密 操作模式 使用GCM模式的AES加密 创建Cipher 对象 初始化Cipher对象 数据加密和解密 ...

  5. java 用面向接口编程的方式开发打印机_Java“打印机”模型理解面向接口编程。实现接口定义类,接口实现类,核心“业务”类分离...

    接口定义类 IinkBox.java package printerDemo.iface; public interface IInkBox { public String getColor(); } ...

  6. C++ 在派生类中使用using声明改变基类成员的可访问性

    通过在类的内部使用using声明语句 , 我们可以将该类的直接或间接基类中的任何可访问成员标记出来 (只限于非私有成员) .using声明语句中名字的访问权限由该using声明语句之前的访问说明符来决 ...

  7. 《Effective Java 2nd》第4章 类和接口

    目录 第13条: 使类和成员的可访问性最小化 第14条:在公有类中使用访问方法而非公有域 第15条:使可变性最小化 第16条:复合优先于继承 第17条:要么为继承而设计,并提供文档说明,要么就禁止继承 ...

  8. 【04】Effective Java - 类和接口

    为什么80%的码农都做不了架构师?>>>    1.使类和成员的可访问性最小化 封装是软件设计的基本原则之一,它的好处就是解除组成系统的各个模块之间的耦合关系,使得这些模块可以独立地 ...

  9. Effective Java读书笔记---四、类和接口

    四.对于所有对象都通用的方法 15.使类和成员的可访问性最小化 区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其 内部数据和其他实现细节 . 信息隐藏 -----& ...

最新文章

  1. 放弃深圳1.5万月薪,我准备回农村了!
  2. lua学习笔试之迭代器和通用for
  3. ORA-12638: 身份证明检索失败 解决方法
  4. 【数据结构】八大数据结构分类
  5. 使用identity+jwt保护你的webapi(一)——identity基础配置
  6. 潜在语义分析原理以及python实现代码!!!!
  7. [Note]Linux查看ASCII字符表
  8. 为什么我们做不到【员工篇】作者:金刚波
  9. 【经典算法】——KMP,深入讲解next数组的求解
  10. 我国首次举办工业互联网“人机对抗”竞赛 检验独创理论独有技术有效性
  11. c++ 建立MFC应用程序
  12. ThinkPad E450 10.11 驱动HD4400的注意即解决方法_s芃成_新浪博客
  13. mysql数据库有dbo吗,sql server所有表的所有者恢复为dbo
  14. 【渝粤教育】 国家开放大学2020年春季 2774畜产品加工技术 参考试题
  15. Docker编译安装httpd
  16. 海信电视全记录:法国再度闯入世界杯决赛,剑指蝉联冠军
  17. 阿尔兹海默症AD最新研究进展(2021年7月)
  18. PostScript(PS 格式)讲解
  19. python PIL库对图片按比例进行分割
  20. 考研英语复习五大计划表

热门文章

  1. 线性回归详解(2)机器学习
  2. 输出1至100的数字之和;
  3. Linux命令之less
  4. web前端目前的就业形势_2020年Web前端的前景及就业形势
  5. while循环——求100以内偶数和
  6. 期刊论文发表的复制比是什么意思
  7. 【Qt】 Fractal Designer 5.1 Bug Report
  8. 安装卡巴斯基个人网络版KIS 7.0之后的蓝屏解决方案
  9. Qt编写可视化大屏电子看板系统30-模块8物料管理
  10. mysql intersect 使用方法_MySQL INTERSECT运算符