《Effective Java》 第一讲:创建和销毁对象

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

一、用静态工厂方法代替构造器

用静态工厂的优点 :

1. 方法有名字,更好理解。

2.不必每次调用的时候都创建一个新对象。

3.可以返回原类型的子类型对象,这样在选择返回类型的时候有了更大的灵活性。

4。在创建参数化类型的实例的时候,使代码更简洁。

 

静态工厂的缺点:

1.本类如果不含有公有或是受保护的构造器,就不能被子类化。

2.与其它的静态方法实际上没有任何区别。

 

二、遇到多个构造参数用构建器

1.实现方式:静态成员类(静态内部类)。 public static class Builder { ... } 

客户端代码可以简写为:Student stu = new Student.Builder (20 , 10).birthday("1996-10-13").grade("大二").build();  

这样当大多数参数都是可选的时候,与使用传统的不断重载的构造器模式相比,使用 builder 模式的客户端代码更易于阅读和理解。构建器也比 java  beans 更安全。

 

三、用私有构造或者枚举强化 Singleton属性

实现1:公有 + 静态 + final ,如: public static final INSTANCE;

实现2:privatestatic final XxxxINSTANCE = new Xxxx( ) ;

public staticXxxxgetInstance ( ) {returnINSTANCE; }

实现3:单个元素的枚举类型。

 

四、通过私有构造器强化不可实例化

比如:工具类中的方法都应该是静态的,工具类不应当被实例化。

 

五、避免创建不必要的对象

1. 能直接赋值就不要new , 如:String  str = new String("123" ) ,应当写为 String str = "123" ;

2. 高频率使用的代码可以考虑抽离为一个方法,该方法可以考虑定义为静态方法

3.优先使用基本类型,而不是包装类,当心无意识的自动装箱,会生成不少多余的对象。

 

六、消除过期对象的引用 

1. 所谓的过期引用是指永远也不会被解除的引用 。比如定义了一个数组,但是其中的部分元素是确定不会被使用的。这种情况视为对象引用 已经过期,就应该清空这些元素,清除这些引用。这样如果以后又被错误的引用 就会立即抛出 NollPointException 。

2. 消除过期引用可帮助防止内存泄露,内存泄露的常见来源是缓存,有时候会把对象的引用 放入到缓存当中,并且长时间遗忘了它,这时就应该考虑缓存中的项是否全都依旧有意义。所以缓存应该不时的清除掉已经无用的项。清除工作可由后台一个线程来完成。

3. 监听器和其它回调也有可能导致内存泄露。如果你实现了一个API, 客户端在API中注册回调,却一直没有显示的取消注册,那么除非你采取某些动作,否则它们就会不断聚集。确保回调立即被当作垃圾回收的最佳方法是保存它们的弱引用,,例如只将它们 保存为WeakHashMap中的键。

 

七、避免使用最终方法

1. 最终方法就是 finalize( ) ,垃圾回收方法。原因是不能保证会及时回收,甚至不能保证会被回收(如果未被捕获的异常在终结过程中被抛出来,那么这种异常可能会被忽略。并且使用终结方法会有严重的性能损失。因此,不应该依赖终结方法来更新重要的持久状态。

2. 应该使用显示的终止方法,通常与 try - finally 结合使用,以确保及时终止。比如字节流、字符流、数据库连接等就应该使用显示的 close 方法。  

 

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

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

相关文章

外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6

外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6本连载讲解作为嵌入式系统开发技术人员所必需具备的单片机的基础知识。 在《单片机入门(1)~(3)》中,我们一起学习了单片机的硬件和编程语言以及开发环境…

如何防止代码腐烂

很多团队都有这个问题,一个项目的代码本来开始设计得好好的,一段时间以后,代码就会变得难以理解,难以维护,难以修改。为什么?我一直在思考这个问题。 让我们先看一个人的情况。 1. 程序员的成长 新手的代码…

什么是商业智能(BI),以及其与数据分析的区别?

BI(Business Intelligence)即商务智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,快速准确地提供报表并提出决策依据,帮助企业做出明智的业务经营决策。它是一种产品/服务,…

php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频)

php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频) 一、总结 一句话总结:超全局数组特别有用,比如$_SERVER可以获取所有的客户端访问服务器的情况。 1、数组遍历三种方式(最不熟悉的那一种)…

git branch 分支

Git自学之路(四)- git branch 分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一…

软件工程师的十个“不职业”行为

职业化是软件工程师的必然选择。本文根据我在教学和软件开发管理方面的实践,列举几个软件工程师“不职业”的行为或习惯,从另外一个侧面进一步探讨什么是真正的软件工程师职业化。职业化之于软件工程师非常重要。因为:软件是看不见也摸不着的…

fn:substring()函数

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 fn:substring()函数返回字符串中指定开始和结束索引的子串。 语法 fn:substring()函数的语法如下&#xff1a; ${fn:substring(<s…

大数据分析如何创建最佳的移动应用用户体验

2019独角兽企业重金招聘Python工程师标准>>> 如今&#xff0c;越来越多的人使用移动应用程序。而移动应用将在未来成为一个价值数十亿美元的产业。大数据可以帮助企业构建最佳的用户体验。 多年来&#xff0c;开发移动应用程序的技术一直在不断发展&#xff0c;这实…

C语言自学的方法

一、C语言入门的基本学习方法 《C语言》的内容很丰富&#xff0c;有的部分涉及到的细节很多&#xff0c;如硬件知识和数据结构知识等&#xff0c;自学时不可能面面俱到&#xff0c;否则必然会顾此失彼&#xff0c;反而抓不住主要矛盾。笔者认为对初学C语言的考生&#xff0c;开…

CAP原理简单理解

C&#xff1a;集群中所有机器状态是一致的。 A&#xff1a;客户端访问集群中任意一个节点&#xff0c;总能得到"处理成功"的结果。 假设有五个节点&#xff1a;n1~n5 &#xff0c;出现网络分区被分成两组&#xff1a;[n1~n2]和[n3~n5]&#xff0c;那么当n1出来客户端…

Jstorm+Spring+mybatis整合

在现有的jstorm框架下&#xff0c;有一个需求&#xff1a;jstorm要对接mysql数据库的实时读取数据&#xff0c; 通过bolt处理&#xff0c;可能要调用service层的框架&#xff0c;最后保存到数据库。 在网上寻找了一下&#xff0c;发现storm集成spring的资料非常少&#xff0c;有…

无限享受百度文库,财富值无视

相信大家在百度上找东西时&#xff0c;遇到有的文库需要财富值&#xff0c;可是自己又没有&#xff0c;是不是很头疼啊。请看&#xff1a; 找到自己要的文库&#xff0c;如我找的文库链接为&#xff1a;http://wenku.baidu.com/view/7db6 ... html?l5.1.5.1&&#xff08;…

JavaScript onerror 事件( window.onerror = )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用 onerror 事件是一种老式的标准的在网页中捕获 Javascript 错误的方法。 实例 onerror 事件 如何使用 onerror 事件捕获网页中的错误…

上海云栖:金融政企行业的CDN最佳实践

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; 在刚刚结束的上海云栖大会飞天技术汇分论坛上&#xff0c;阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享&#xff0c;为上海的嘉宾介绍CDN的解决方案与技术服…

lunix基本命令

安装lunix 批量创建文件 whoami查看当前用户 sudo adduser lilei创建用户 groups lilei 查看用户所属用户组 sudo usermod -G root lilei 赋予root权限 sudo deluser lilei --remove-home ls -l 显示目录的文件 ls -a 显示隐藏文件 PWD 获取当前目录 cd .. 返回上层目录 cd 进入…

开启Swarm集群以及可视化管理

为什么80%的码农都做不了架构师&#xff1f;>>> 在搭建的两台coreos服务器上开启swarm集群 前置条件&#xff1a; docker均开启2375端口同一个局域网内主服务器上安装Portainer容器安装Portainer容器执行&#xff1a; docker run -d -p 9000:9000 --restartalways …

python基本语法:序列

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 序列的基本操作&#xff1a; 2.用例&#xff1a; 3.序列包含字符串、元组、列表。

移动互联网开始降温:“人才热”退烧

去年的疯狂抢人变成了今年的裁员甚至关门歇业&#xff0c;漫天要价变成了工作难找&#xff0c;移动互联网市场正回归理性 工作不好找了。 “去年这个时候&#xff0c;一个刚毕业的Android开发工程师&#xff0c;就能轻松拿到七八千一个月&#xff0c;而今年&#xff0c;很难找到…

MAP存储数据

map可以装多种类型的值&#xff0c;当然键不能重复&#xff0c;值可以重复。可以使用多种类型的父类&#xff0c;来指定值的类型。比如Object是其他类的父类。例如&#xff1a;HashMap<Object,Object>&#xff0c;它的键和值都可以存储多种类型&#xff0c;反正都是Objec…

IMDb、烂番茄、MTC、各种电影行业评分名字整理

这篇不是技术文章&#xff0c;就是对总是看到但是不知道具体是什么的一些电影名词、评分、来源&#xff0c;学习一下。 IMDb 互联网电影资料库&#xff08;Internet Movie Database&#xff0c;简称IMDb&#xff09;是一个关于电影演员、电影、电视节目、电视明星和电影制作的在…