本文参考

本篇文章参考自《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. 【C# 线程】线程池 epoll和IOCP之比较

    总结:IOCP :我的打印文件放在店里面排队,轮到我打印了,店长帮我打印一下,打印好了通知我来拿 Epoll  :我的打印文件放在店里面排队,轮到我叫我一下,我自己来打印. 直入正题:Epoll 是L ...

  2. 不知道这10个术语,你还敢说会JavaScript?

    每个行业,都有业内"行话",不了解这些行话的人,很难融入到行业中,也永远装不了逼. 从Curry到Closes,有很多JavaScript行话(该领域中使用的特殊词汇)知道这些行话 ...

  3. Linux图形界面和命令界面切换

    转至:https://blog.csdn.net/weixin_43683466/article/details/85727723 1.若虚拟机内热键被占用,可通过下图所示修改,移出快捷键ctrl+a ...

  4. 【用户状态】详细解读Oracle用户ACCOUNT_STATUS的九种状态

    转至:http://blog.itpub.net/519536/viewspace-672276/ DBA_USERS视图中ACCOUNT_STATUS记录的用户的当前状态,一般情况下在使用的正常用户 ...

  5. Echarts图表类型

    每个系列通过 type 决定自己的图表类型: type: 'bar':柱状/条形图 type: 'line':折线/面积图 type: 'pie':饼图 type: 'scatter':散点(气泡)图 ...

  6. ROC/AUC以及相关知识点

    参考博文,特别的好!!!:https://www.jianshu.com/p/82903edb58dc AUC的计算: 法1:AUC为ROC曲线下的面积,那我们直接计算面积可得.面积为一个个小的梯形面 ...

  7. IDEA 快捷键和字体设置

    IDEA的使用 一.IDEA 目录 IDEA的使用 一.IDEA 设置字体 文本字体设置 窗口字体设置 二.IDEA建立项目 三.IDEA快捷键 设置字体 点击File->Settings 文本 ...

  8. 【译】ASP.NET Core 6 中的性能改进

    原文 | Brennan Conroy 翻译 | 郑子铭 受到 Stephen Toub 关于 .NET 性能的博文的启发,我们正在写一篇类似的文章来强调 6.0 中对 ASP.NET Core 所做 ...

  9. 【OpenCV】【计算机图形学】DIBR: Depth Image Based Rendering/ 3D image warping 中的实现细节

    最近在学习DIBR并尝试实现.感觉网上相关资料比较少,大多还是爬虫,决定自己写一个. DIBR就是depth image based rendering问题.输入一个视角下的图像和深度图,要求你输出另 ...

  10. laravel 终端命令

    创建模块及控制器