Effective Java —— 使类和成员的可访问性最小化
本文参考
本篇文章参考自《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 —— 使类和成员的可访问性最小化的更多相关文章
- Effective Java --使类和成员的可访问性最小化
尽可能地降低可访问性 接口和成员变量访问级别四种访问级别: 私有的(private) --- 只有在生命该成员的顶层类内部才可以访问 包级私有的(package-private) --- 缺省的&qu ...
- Effective Java 第三版——15. 使类和成员的可访问性最小化
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 《Effective Java》笔记 使类和成员的可访问性最小化
类和接口 第13条 使类和成员的可访问性最小化 1.设计良好的模块会隐藏所有的实现细节,把它的API与实现清晰的隔离开来,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况: ...
- EffectiveJava(13)使类和成员的可访问性最小化
1.为什么要使类和成员可访问性最小化 它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立的开发 测试 优化 使用 理解和修改.提高软件的可重用性 2.成员的访问级别 私有(priva ...
- Effective Java:Ch4_Class:Item13_最小化类及其成员的可访问性
要区别一个模块是否设计良好,最重要的因素是,对于其他模块而言该模块隐藏其内部数据和其他实现细节的程度.设计良好的模块应该隐藏所有实现细节,将API与其实现清晰地隔离开来.这样,模块之间通过他们的API ...
- Java - 使可访问性最小化
模块设计是否良好,有个重要的因素在于,相对外部模块是否隐藏内部数据以及实现细节. 设计良好的模块会隐藏实现细节,并将API与其实现隔离开来. 模块之间通过API进行通信,对于内部工作情况互不可见. 即 ...
- Effective java -- 3 类和接口
第十三条:使类和成员的可访问性最小化 一个设计良好的模块会将实现细节隐藏起来,只将暴露API.模块之间调用并不知道对象的细节.这个概念成为信息隐藏或封装.要注意一点,设计的一个方法或者其他什么,只要不 ...
- Java面向对象——类的成员
Java面向对象——类的成员 摘要:本文主要介绍了类的常见成员. 属性 属性称为成员变量,一般来讲不用赋值,因为有默认值,另外显式赋值没有意义会导致所有由此类创建对象都是此值. 默认值 Boolean ...
- 一.OC基础之:1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问
1,OC语言的前世今生 , 一, 在20世纪80年代早期,布莱德.麦克(Brad Cox)设计了OC语言,它在C语言的基础上增加了一层,这意味着对C进行了扩展,从而创造出一门新的程序设计语言,支持对象 ...
随机推荐
- Delegate 委托细说
目录 委托的申明 委托的赋值 委托实例方法的使用C#Invoke\BeginInvoke\Endinoke 系统自带的委托Action.Action<T>.Func<T>.P ...
- Bash初识与常用命令
转至:https://www.cnblogs.com/baishou/p/13850258.html Shell介绍 Shell在中文的意思是壳,寓意是操作系统的壳.Shell是指一种应用程序,这个应 ...
- 利用logrotate工具对catalina.out进行日志分割实战
logrotate是linux自带的日志分割工具,如果没有可以用yum安装 yum -y install logrotate 要配置日志分割定时任务,需要在/etc/logrotate.d/下创建一个 ...
- HTML学习如何布局
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>菜鸟 ...
- Python:tkinter无法同时显示多个image的解决方法
0.问题 在用Tkinter进行编程时,需要在一个Frame下显示多个图片,但是不管怎么设置都是只显示最后一张,就像这样: 代码 for i in range(3): ... image=ImageT ...
- python中os.walk的用法详解
python中os.walk是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 1.载入要使用os.walk,首先要载入该函数 可以使用以下两种方法 import os f ...
- python之random.seed()函数
Python--random.seed()用法 第一次接触random.seed(),可能理解的不是特别对,大家欢迎指错,整理自网络,侵权删除 概念 seed()是改变随机数生成器的种子,可以在调用其 ...
- 监听页面中的某个div的滚动事件,并将其滚动距离保存到cookie
在html中,写一个id为type的div: <div class="type" id="type"></div> css: .type ...
- emu8086 调用LED面板的方法
一.实验要求 1.熟悉并掌握 EMU8086 汇编语言调试环境: 2.学习 8086 的指令系统,输入简单的指令,观察各寄存器.内存相关单元以及处理器标志位的变化(所有数据传送类指令,可参考教材用例) ...
- Java案例——冒泡排序
排序:将一组数据按照固定的规则进行排列 冒泡排序:一种排序方式,对将要排序的相邻的数据进行两两比较,将较大的放在后面,依次对所有的数据进行操作,直到所有的数据按要求完成排序 冒泡排序原理: 1.如果有 ...