Item 13 Minimize the accessibility of classes and members

区分好的模块和不好的模块最重要的因素是看这个模块对于其他模块而言是否隐藏内部数据和其他细节。好的模块会把所有细节隐藏起来,把API和实现隔离开来,模块之间用API通信。这就是information hiding或者封装(encapsulation)。是软件设计基本原则之一。

information hiding最大的意义在于it decouples(解耦) the modules that comprise a system. 这样模块就能独立开发、测试。提高了可重用性

Java中很多facility协助了信息隐藏,比如访问控制access control,决定了类,接口,成员的accessibility。

The rule of thumb: **尽可能使每个类或者成员不被外界访问。**也就是给最小的访问级别。


顶层类和接口

Top level(non-nested)的classes and interfaces,只有两种可能的访问级别:

  • package-priavte(笔者注:也就是default) The member is accessible from any class in the package where it is declared
  • public

成员(fields, methods, nested classes, and nested interfaces)

  • private—The member is accessible only from the top-level class where it is declared.
  • package-private—The member is accessible from any class in the package where it is declared. Technically known as default access, this is the access level you get if no access modifier is specified.
  • protected—The member is accessible from subclasses of the class where it is declared (subject to a few restrictions [JLS, 6.6.2]) and from any class in the package where it is declared.
  • public—The member is accessible from anywhere.

  • 从package-private变成protected时,accessibility会大大增强。protected members应该尽量少用。

  • 子类中覆盖的方法的访问级别不能低于父类的那个。特别的,对于接口来说,接口中所有的方法都隐含着公有访问级别;所以如果一个类实现了接口,接口中所有方法在这个类中也必须被声明为公有的。

  • instance field永远不能是public的。 Classes with public mutable fields are not thread-safe. 这一点也就解释了之前我讨论的为什么android中的context不能写成 public static Context context;(当然对于android来说,private也不行,因为context不能是static)。这一点我还是不太明白,主要不明白instance field是啥,与之对应的static field是啥。

  • 同样的建议适用于静态域。

总之,防止任何散乱的类、接口、成员变成API的一部分。除了Public static final的特殊情形,public class都不应该含有public fields. 还要确保public static final域的对象都是不可变的,比如,不能定义一个public static final Things[] VALUES = {...};因为非0数组是可变的。

转载于:https://juejin.im/post/5a31341851882535cd4ad56a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/539849.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/539849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html 物流状态,使用css实现物流进度的样式的实例代码

效果:css样式:ul li {list-style: none;}.package-status {padding: 18px 0 0 0}.package-status .status-list {margin: 0;padding: 0;margin-top: -5px;padding-left: 8px;list-style: none;}.package-status .status-list>li {border-left: 2px so…

GPL概念

一、GPL概念 全称为 General Public License,翻译为通用公共许可,是最著名的开源许可协议。Linux内核就是在GPL许可下发布的,GPL许可是由自由软件基金会Free Software foundation 创建的,由Richard Stallman 和一帮人共同努力发起…

点钞机语音怎么打开_原来微信语音一样能转发? 居然还有人不知道

微信怎么把语音转发给别人?原来这个简单啊,微信作为一款我们最常用的社交工具,无论是生活还是工作过程中,我们都能够用到微信。那么大家知道微信怎么把语音转发给别人吗?有的人肯定就会回答说:"跟转发…

圆与平面的接触面积_视频:5.3RJ六年级上册圆的面积例题+习题讲解

一、什么是面积物体表面的大小就是它们的面积。长方形的面积长宽正方形的面积边长边长平行四边形的面积底高三角形的面积底高2梯形的面积(上底下底)高2圆所占平面的大小叫做圆的面积。二、剪切法推导圆的面积把圆转化成近似的长方形,当平均分成的份数越来越多&#…

Reactjs 踏坑指南1: 一些概念

Reactjs 踏坑指南1: 知识点 什么是React虚拟DOMJSX组件生命周期和状态事件单项数据流Reactjs和Angularjs的对比React简介 React是一个Facebook开发的UI库。使用这个库可以很方便的开发交互式的、具有表达力的和可重用的UI组件。本身并不是一个框架,可视为…

Linux为什么受欢迎?

1、Linux以高效和灵活著称,实现了几乎全部的Unix特性,同时具备多任务,多用户的能力,支持多线程,多CPU架构。 2、Linux操作系统软件包:包含了文本编辑器,高级语言编译器,以及X-Windo…

直播的学习与使用-----采集

// 捕获音视频 - (void)setupCaputureVideo { // 1.创建捕获会话,必须要强引用,否则会被释放 AVCaptureSession *captureSession [[AVCaptureSession alloc] init]; _captureSession captureSession; // 2.获取摄像头设备,默认是后置摄像头 AVCaptureD…

html css js编程顺序,html css js先学哪个呢?

前端开发三剑客为 HTML、CSS、JavaScript。这三门语言的掌握对前端开发程序员来说是必须的,但有不少同学不懂得先学习哪一门语言。那么这篇文章 w3cschool 小编就来为你解答一下 HTML、CSS、JavaScript 先学哪个的问题。首先需要学习的是 HTML,HTML 是开…

苹果手机收不到推送信息_iPhone手机收不到正式版系统更新推送怎么办?(附解决方法)...

有不少热衷于升级系统的小伙伴,希望在第一时间升级到最新版 iOS 系统进行体验,但难免也会遇到无法收到更新推送的问题。主要有以下原因。iPhone手机收不到正式版系统更新推送怎么办?网络状况不佳如果当前网络状况不好,可能无法收到来自苹果官…

Linux系统特点介绍集合

1、开源代码程序,可自由修改。 2、Unix系统兼容,具备Unix几乎所有优秀特性,同Unix指令集。 3、可自由传播,无任何商业版权制约。 4、适合Intel等x86 CPU系列架构的计算机。 5、一个完善的多用户,多任务&#xff0c…

火狐 移动 html 元素,python中的Firefox+Selenium:如何交互式地获取元素html?

Im使用PythonSeleniumSplinterFirefox创建一个交互式web爬虫。在python脚本提供了选项,然后Selenium打开Firefox并发送一些命令。在现在,我需要让python脚本知道用户想要与之交互的web元素。在我目前使用的方法是:Right-click the item in th…

瘦子的肠道菌群和胖子的区别_瘦子和病态肥胖患者肠道菌群组成和潜在功能的显著差异...

10.1111/joim.1313707-07, ArticleAbstract & Authors:展开Abstract:收起Introduction:The gut microbiome may contribute to the development of obesity. So far, the extent of microbiome variation in people with obesity has not been determined in large cohorts…

Centos下载地址

下载地址: 从阿里镜像网站上下载 http://mirrors.aliyun.com/centos/ 建议选用Centos 6.x windows电脑配置:至少4G内存,i5处理器或以上。 Linux虚拟机分配:内存128M~1024M,cpu 1核心,硬盘8g即可。

html分块时边距的设置,html – 文本节点后第一个块的边距(垂直空间)?

我不确定你是否会认为这是对你的问题的完整答案,因为我知道你正在使用< td>在您的示例中,< td>之间存在一个差异.和< dd>或者< li>元素是< td>的事实.在不破坏< table>的情况下,元素不能与其周围元素相抵消具体行为.但至少我可以回答你的第…

实现连麦_微信重磅更新,视频号直播连麦打赏美颜上线,新增巨大流量入口

12月23日晚&#xff0c;微信迎来重大改版&#xff01;在最新7.0.20版本的微信中&#xff0c;视频号大招不断&#xff0c;不仅上线了连麦功能&#xff0c;支持美颜瘦脸、打赏等功能。此外&#xff0c;微信还给视频号开放了两个重大入口&#xff0c;包括微信个人名片和“发现”ta…

VMware Workstation 网络设置解释三种

一、NAT Network Address Translation&#xff0c;网络地址转换&#xff0c;NAT模式是比较简单的实现虚拟机上网的方式&#xff0c;NAT模式的虚拟机时通过物理电脑上网和交换数据的。 在NAT模式下&#xff0c;虚拟机的网卡连接到物理机的VMware上&#xff0c;此时VMware软件的…

cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽

Abstract: 本文通过矩阵转置这一个例子&#xff0c;调整&#xff0c;优化核函数&#xff0c;使其达到最优的内存带宽Keywords: 带宽&#xff0c;吞吐量&#xff0c;矩阵转置开篇废话下面是废话&#xff0c;与本文知识无关&#xff0c;可以直接跳到下面红字处开始本文知识的学习…

小程序 - swiper除了左右切换还有上下滚动超出屏幕的内容

本来呢&#xff0c;我是有专门整理小程序恶心bug的文章的&#xff0c;每次只要添加汇总就好&#xff0c; 但是呢&#xff0c;鉴于这个问题的恶心程度&#xff0c;所以我把他单独拿出来说了。 ——————————————--------------------------------------------------产…

学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的

类似问题答案我学的是计算机专业&#xff0c;南京有那些学校招这个专业啊&#xff1f;跟随 已跟随 取消 确定 你是说去学习还是去工作&#xff1f; 如果工作&#xff0c;现在很多对学位有一定要求&#xff0c;一般都要本科以上&#xff1b; 如果是学习&#xff0c;那也得看你自…