Effective Java读书笔记--创建和销毁对象
1、优先考虑用静态工厂方法代替构造器
2、遇到多个构造器参数时要考虑使用构建器Builder
解决参数过多,不可变类型。私有构造方法,静态类的构造方法提供必要参数,剩下可选。new xxx.build()
3、用私有构造器或者枚举类型强化Singleton属性。
单例:无状态。
实现单例如果实现序列化接口,可能会在序列化和反序列化导致有多个实例产生。
枚举的实现方法可以解决,但是枚举不太好去继承。
枚举是目前最佳实现单例的方法。
4、通过私有构造器强化不可实例化的能力
5、优先考虑依赖注入来引用资源。
资源都是单例,可能依赖多个。
6、避免创建不必要的对象。
比如正则要反复用,就弄个静态常量pattern。有限状态机编译耗性能。
优先使用基本类型,主要因为不小心使用自动装箱拆箱的代码导致问题。
7、消除过期的对象引用
注意内存泄漏,数组里面对对象的引用,Map,集合等等。设置为null,清空对象引用是一种例外,而不是规范。最好的办法靠GC,不再引用。
只要类是自己管理内存,就要警惕内存泄漏!
内存泄露来源:自己管理内存,缓存,监听器和其他回调。
监听器和其他回调:你实现一个api,客户端注册,却没有取消注册。应该用弱引用。weakHashMap,可以让当有外部引用某个key,就不会被回收。
8、不要调用finalize和cleaner的方法。
不可预期,不安全(finalizer attack),性能差。
9、优先调用try-with-resource,而不是try-finally,try-with-resource也可以捕获异常,而且要求实现autoclose.try-finally如果需要同时开启多个资源,后抛出的异常会覆盖掉前面的,比如close抛出的异常。try-with-resource只是禁止异常,堆栈会提示异常被禁止。
最新文章
- mysqli_fetch_assoc php的新的库函数
- JavaScript类库---JQuery(一)
- HealthKit的使用
- FMDB浅析
- 我为什么反对推荐新人编程C/C++语言入门?
- php 面向对象的方式访问数据库
- js遍历
- 【LeetCode】11. Container With Most Water
- rysnc,scp与bashrc冲突问题
- IOS NSURLRequest 设置 Header
- 新手学js的效果图1---( 淘宝等商城货物查看特效)
- hdu1541 Stars 树状数组
- sudoku--设想
- 网络编程-Socket介绍
- 定时任务redis锁+自定义lambda优化提取冗余代码
- Oracle性能优化5-索引的不足
- 初学者问题一oracle
- HDU 1242 Rescue (BFS+优先队列)
- with(上下文的用法)以及其他知识点
- java中boolean类型占几个字节
热门文章
- nginx 重写去掉index.php
- centos7 在虚拟机中装好后的网络连接问题
- 【Java基础】面向对象中
- 天梯赛练习 L3-011 直捣黄龙 (30分) dijkstra + dfs
- Nginx基础知识学习(安装/进程模型/事件处理机制/详细配置/定时切割日志)
- Linux学习笔记 | 常见错误之VMware启动linux后一直黑屏
- o_direct刷新方式和文件系统支持Direct i/o
- 关于QTableWidget中单元格拖拽实现
- SpringBoot WebSocket技术
- pandas DataFrame的新增行列,修改、删除、筛选、判断元素以及转置操作