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进行了扩展,从而创造出一门新的程序设计语言,支持对象 ...
随机推荐
- Win11右键菜单怎么修改为传统Win10右键风格?
前言 对于开发者而言,右键菜单会集成一些功能,升级 Win11 的右键菜单反而对开发造成不便,所以修改回传统风格. 修改成果如下 两个步骤改回传统右键风格 第一步:首先用鼠标右键点击开始菜单,选择 w ...
- android --一个简单的登录界面
MainActivity.java package com.example.empty_project; import androidx.appcompat.app.AppCompatActivity ...
- 微信小程序书简易支付
这里结合了上一篇的手机号登录接下来的实现功能 https://www.cnblogs.com/xiaoyantongxue/p/15472915.html 登录后进入课程选择页面 1:数据库填入数据 ...
- php 23种设计模型 - 适配器模式
适配器模式(Adapter) 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类, ...
- js格式化树形数据(扁平化数据)
需求: 1.把如下数据按照parent_id等于id的规则建立父子关系 2.同一层级的数组按照order升序 [ { "id": 1, "name": &quo ...
- CPU是海王?聊聊 主/子线程 和 同/异步 的关系
最近表弟一直在找实习,经常会问我一些问题,有些问题在没有经历过真实工作时是真的不好理解的,所以我开了这个[表弟专栏],专门为找工作的表弟解决一些疑惑. 这篇文章从计算机发展的角度出发,描述为什么计算机 ...
- MATLAB绘制三角网及三维网线
今天博主给大家介绍一些比较常见的可视化操作,绘制三角网及三维网线. 三角网是由一系列连续三角形构成的网状的平面控制图形,是三角测量中布设连续三角形的两种主要扩展形式,同时向各方向扩展而构成网状,优点为 ...
- ArcMap线上均匀生成点
面中均匀生成点方法: [创建渔网]→[要素转点](或[要素折点转点])→[裁剪](或[按位置选择]→[导出数据]),即可. ArcMap中随机生成点: [随机生成点]工具 最近博主的朋友有均匀布点的需 ...
- 【自动化基础】allure描述用例详细讲解及实战
前言 allure可以输出非常精美的测试报告,也可以和pytest进行完美结合,不仅可以渲染页面,还可以控制用例的执行.下面就对allure的使用进行一个详细的介绍和总结. 需要准备的环境: pyth ...
- [SWPU2019] NETWORK
[SWPU2019]Network(TTL隐写) 1.题目概述 2.解题过程 文档中的数字代表什么呢?会不会是RGB? 看了一下以前做过的题目,好像并不是 那是什么呢?百度告诉我这是TTL隐写,哇,长 ...