[Effective Java] 创建和销毁对象篇
[Effective Java] 创建和销毁对象篇
1. 优先考虑用静态工厂方法代替构造器
优点:
- 静态工厂方法相比于构造器,它们有名称
- 不需要每次在使用的时候创建一个对象
- 可以返回原返回类型的任何子类型的对象
- 在创建参数化是来的时候,代码更加简洁
缺点:
- 不能被子类化(因为鼓励程序使用复合,而不是继承)
- 与其他的静态方法实际上没有任何区别(想要查明如何实例化一个类比较困难)
常用静态工厂方法名称:
- valueOf(类型转换方法)
- of
- getInstance(singleton)
- newInstance(每次实例化出来的都和其他实例不同)
- getType
- newType
2. 遇到多个构造器参数时要考虑用构建器
常用模式:
- 重叠构造器(太繁琐,要提供所有参数数量的构造器)
- JavaBeans模式(无参构造函数,然后使用setter方法)(线程安全问题)
- Builder模式
该类构造函数为私有,但提供一个公有的构造函数public static class Builder所有参数都有自己的public函数并返回this,且默认值都放在Builder类中,new Builder()后可以链式调用,最后调用无参函数build() return new xxx();
例如NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build()
3. 用私有构造器或者枚举类型强化Singleton属性
实现Singleton的三种方式:
1. 构造器私有
导出公有静态成员(public static final Elvis INSTANCE = new Elvis())
公有静态工厂方法
public static Elvis getInstance() { return INSTANCE },为了防止反序列化,需要声明所有实例域都是瞬时(transient)的,且要提供private Object readResolve() { return INSTANCE;}方法。单个元素的枚举类型
可序列化,且绝对防止多次实例化,包括防止反射攻击,是Singleton的最佳方法
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {...}
}
4. 通过私有构造器强化不可实例化的能力
工具类不希望被实例化的方式:
- 做成抽象类,防止实例化,但是会被误以为是需要继承才可使用
- 构造器设为私有,并添加注释(推荐)
5. 避免创建不必要的对象
对于在同一台虚拟机中运行的代码,只要包含相同字符串字面常量,该对象就会被重用。
要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
通过维护自己的对象池来避免创建对象并不是一种好的做法,除非池中的对象是非常重量级的。
当你应该重用现有对象的时候,请不要创建新的对象。但要注意“保护性拷贝”
6. 消除过期的对象引用
内存泄漏常见来源:
- 管理内存不当
- 没有清除过期缓存
- 监听器和其他回调
7. 避免使用终结方法
终结方法的缺点在于不能保证会被及时地执行。(JVM会延迟执行终结方法)
依赖终结方法来释放共享资源上的永久锁,容易让整个分布式系统垮掉。
使用终结方法会有很严重的性能损失。
使用显示的终止方法,配合try-finally使用(例如.close())
尽量不要使用终结方法,如果用的话一定要记住调用super.finalize
[Effective Java] 创建和销毁对象篇的更多相关文章
- Effective Java 创建和销毁对象
<Effective Java>阅读笔记,用适合自己理解的方式提炼该书内容.<Effective Java>是一本很实用的书,阅读方法应该是快速的领会,总结,然后应用.而非,一 ...
- Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器
//构建器抽象类,为不同类的实现提供 public interface Builder<T> { public T build(); } /** * @描述: 营养表 */ public ...
- JAVA创建和销毁对象
类静态方法取代构造方法创建对象 类静态方法有名称,可以通过名称说明返回的是什么类型的实例 可以控制是否需要新开辟内存空间 返回值是可以控制的 实体类属性非常多的时候使用build模式创建对象 单例实体 ...
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- 《Effective Java》读书笔记(一)之创建和销毁对象
最近在研读<Effective Java>一书,读书不做点笔记,感觉很容易就忘掉,于是用本篇博客来记录阅读此书的笔记. 郑重声明: 由于是<Effective Java>一书的 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- 《Effective Java》—— 创建与销毁对象
本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑 ...
- 和我一起学Effective Java之创建和销毁对象
前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象
随机推荐
- Could..... not preload global game manager
发布PC版后出现这个错误,是没有破解成功,卸载后重新安装破解就可以了 http://www.cocoachina.com/bbs/read.php?tid=84587
- sudoers文件解析 转自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1971013
今天在用户组中新加了一个普通用户,开始这个用户没有sudo权限,于是通过sudo visudo修改了sudo的配置文件,赋予了普通用户的root权限.后来想着能不能将/etc/sudoers文件的访问 ...
- NEC 工程师规范
工程师规范 - 开发准备 了解产品和设计 参加需求.交互.视觉会议,了解产品设计和项目成员. 了解产品面向的设备和平台. 了解产品对兼容性的要求以及是否采用响应式设计等. 了解产品要使用的技术(WEB ...
- 洛谷P1731 [NOI1999]生日蛋糕(爆搜)
题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱 ...
- fjutacm 3700 这是一道数论题 : dijkstra O(mlogn) 二进制分类 O(k) 总复杂度 O(k * m * logn)
/** problem: http://www.fjutacm.com/Problem.jsp?pid=3700 按二进制将k个待查点分类分别跑dijkstra **/ #include<std ...
- Java 的标识接口作用
原文地址:标识接口 作用作者:feisong 时间:2019-01-2315:49:35 标识接口是没有任何方法和属性的接口.标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定 ...
- MySQL中Date,DateTime,TimeStamp和Time的比较
名称 显示格式 显示范围 应用场景 后台取值 Date YYYY-MM-DD 1601-01-01 到 9999-01-01 当业务需求中只需要精确到天时, 可以用这个时间格式 @JSONField( ...
- java的动态验证码单线设计
1.java的动态验证码我这里将介绍两种方法: 一:根据java本身提供的一种验证码的写法,这种呢只限于大家了解就可以了,因为java自带的模式编写的在实际开发中是没有意义的,所以只供学习一下就可以了 ...
- git merge最简洁
一.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支 git checkout devgit pullgit checkout mastergit merge devgit p ...
- dedecms添加/编辑文章如何把附加选项去掉默认勾选状态
1.去掉添加时默认勾选状态. 在 系统->系统基本参数->其它选项 中,如图中的三个选项选择否即可. 设置完后可以看到添加时已经默认不勾选,但是编辑文章时还是默认勾选状态. 2.去掉编辑时 ...