本文参考

本篇文章参考自《Effective Java》第三版第十五条"Minimize the accessibility of classes and members"

Access modifiers (private, package-private, protected and public)

访问修饰符

同类

同包

不同包子类

不同包非子类

private

     

package-private(默认)

   

protected

 

public

Make each class or member as inaccessible as possible

顶层类和接口的访问权限往往会设计为public和package-private,如果package-private访问权限已经能够满足需求,则应该设计为package-private权限。

If a top-level class or interface can be made package-private, it should be

被public权限修饰符(以及protected权限修饰符)修饰的成员方法或成员变量往往是需要交付给客户的公共API,并且这些API不应该发生频繁的修改。而package-private权限修饰符修饰的类和接口则代表包内的某种业务逻辑实现,客户不需要关心也无法知道它们的API有哪些,因此对这些类和接口的方法签名的修改不会影响客户对系统的使用,也能够更好的区分内部实现的方法和外部暴露的方法

If a package-private top-level class or interface is used by only one class, consider making the top-level class a private static nested class of the sole class that uses it

正如上一点所说,我们需要尽可能地降低类、接口、成员方法和成员变量的可访问性,因此当一个package-private的类或接口A仅仅被另外一个类B使用时,可以考虑将A作为内部类内聚到B中

这样做的好处是,确保了包内的其它类和接口不会越权访问

Only if another class in the same package really needs to access a member should you remove the private modifier

当我们无法确定成员方法和成员变量合适的访问权限时,应当将它设计为private,当同一个包内的另一个类需要用到它时,再将它设计为package-private权限。也就是说,我们在设计类时,应当从private关键字开始逐级地开放成员方法和成员变量的权限

Tests can be made to run as part of the package being tested, thus gaining access to its package-private elements

当我们把类、接口、成员变量或成员方法的权限修饰符设计为package-private时,专门放置于"test"包内的测试代码就无法访问它们,我们不能够为了测试的便利而去提高它们的权限,而是将测试代码和包级私有的实现代码放到一起

Instance fields of public classes should rarely be public

譬如在"单例模式"的实现代码中,我们不会将instance成员变量的权限修饰符定为public,而是增加一个getInstance()的方法来或取单例。因为public权限修饰会使得程序的任何一处都可以修改该引用所指向的对象的值,所以在多线程的情况下更有可能导致严重的线程安全问题

注意,即使为引用类型的字段添加final关键字也无法确保对象的值不被更改,只是确保了对象的引用不变,这对于数组类型的字段也是如此

it is wrong for a class to have a public static final array field, or an accessor that returns such a field. If a class has such a field or accessor, clients will be able to modify the contents of the array.

针对数组的情况,有两种解决方法,一种是通过Collections.unmodifiableList()方法返回一个不可更改的List,另一种是调用数组的clone()方法,返回一个数组元素的深拷贝

Effective Java —— 使类和成员的可访问性最小化的更多相关文章

  1. Effective Java --使类和成员的可访问性最小化

    尽可能地降低可访问性 接口和成员变量访问级别四种访问级别: 私有的(private) --- 只有在生命该成员的顶层类内部才可以访问 包级私有的(package-private) --- 缺省的&qu ...

  2. Effective Java 第三版——15. 使类和成员的可访问性最小化

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. 《Effective Java》笔记 使类和成员的可访问性最小化

    类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...

  4. EffectiveJava(13)使类和成员的可访问性最小化

    1.为什么要使类和成员可访问性最小化 它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立的开发 测试 优化 使用 理解和修改.提高软件的可重用性 2.成员的访问级别 私有(priva ...

  5. Effective Java:Ch4_Class:Item13_最小化类及其成员的可访问性

    要区别一个模块是否设计良好,最重要的因素是,对于其他模块而言该模块隐藏其内部数据和其他实现细节的程度.设计良好的模块应该隐藏所有实现细节,将API与其实现清晰地隔离开来.这样,模块之间通过他们的API ...

  6. Java - 使可访问性最小化

    模块设计是否良好,有个重要的因素在于,相对外部模块是否隐藏内部数据以及实现细节. 设计良好的模块会隐藏实现细节,并将API与其实现隔离开来. 模块之间通过API进行通信,对于内部工作情况互不可见. 即 ...

  7. Effective java -- 3 类和接口

    第十三条:使类和成员的可访问性最小化 一个设计良好的模块会将实现细节隐藏起来,只将暴露API.模块之间调用并不知道对象的细节.这个概念成为信息隐藏或封装.要注意一点,设计的一个方法或者其他什么,只要不 ...

  8. Java面向对象——类的成员

    Java面向对象——类的成员 摘要:本文主要介绍了类的常见成员. 属性 属性称为成员变量,一般来讲不用赋值,因为有默认值,另外显式赋值没有意义会导致所有由此类创建对象都是此值. 默认值 Boolean ...

  9. 一.OC基础之:1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问

    1,OC语言的前世今生 , 一, 在20世纪80年代早期,布莱德.麦克(Brad Cox)设计了OC语言,它在C语言的基础上增加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象 ...

随机推荐

  1. SPYEYE手机远程监控和官方SPYEYE间谍软件最新下载方式

    听起来远程控制手机好像很高级的样子,但是实现起来其实非常简单.实现原理如下: 运行程序,让程序不停地读取数据 用手机给手机发送邮件 判断是否读取到指定主题的手机,如果有,则获取手机内容 根据邮件内容, ...

  2. 【C#Task】TaskCreationOptions 枚举

    根据 TaskCreationOptions 的不同,出现了三个分支 LongRunning:独立线程,和线程池无关 包含 PreferFairness时:preferLocal=false,进入全局 ...

  3. 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式

    一.简单cpu  是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...

  4. Oracle分析函数/排名函数/位移函数/同比环比

    分析函数 作用:分析函数可以在数据中进行分组,然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值.统计函数:MAX(字段名).MIN(字段名).AVG(字段名).SUM(字段名).CO ...

  5. 《Java从入门到精通》学习笔记(详细)

    目录 03 Java语言基础 基本数据类型 变量与常量 运算符 类型转换 代码规范 标识符命名规范 常用输入输出 04 流程控制 条件语句 循环语句 循环控制 练习 05 字符串 创建字符串 连接字符 ...

  6. Linux概述及简单命令

    Linux概述及简单命令 转自https://www.cnblogs.com/ayu305/p/Linux_basic.html 一.准备工作 1.环境选择:VMware\阿里云服务器 2.Linux ...

  7. 小程序swiper高度自适应解决方案

    scroll-view 里面继续套一个 scroll-view ,设置纵向允许滚动 <swiper class="swiper"> <swiper-item> ...

  8. SQL Server用SPLIT函数分割字符串

      declare @str varchar(100),@sql varchar(1000)set @str='1,2,3,4,5,6,7,8,9,10'set @sql='select Value= ...

  9. UML类图的补充及软件设计原则

    UML类图的补充及软件设计原则 UML 从目标系统的不同角度出发,定义了用例图.类图.对象图.状态图.活动图.时序图.协作图.构件图.部署图等 9 种图. 1.uml补充 统一建模语言(Unified ...

  10. Spring注解简析

    JAVA 元注解 @Documented @Inherited @Retention @Target @Repeatable @Native 在java.lang.annotation包下,除了@Na ...