Effective Java 学习笔记之创建和销毁对象
一、考虑用静态工厂方法代替构造器
1、此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法。
2、静态工厂方法的优势有:
a、使用不同的方法名称可显著地表明两个静态工厂方法的不同,而不像构造器,名字只能是类名。
b、并不是每次调用静态工厂方法,都会重新构造一个新的对象。
c、可以返回类型的子类型的对象。
d、创建参数化类型的实例时,代码变得简洁了。
3、静态工厂方法的缺点有:
a、类如果不含有公有的或者受保护的构造器,就不能被子类化(静态工厂方法的存在导致构造器存在的必要性降低)
b、与其他的静态方法实际上没有任何区别。
4、静态工厂方法的惯用名:
a、valueOf(类型转换方法)
b、of(同valueOf,在EnumSet中流行)
c、getInstance
d、newInstance(返回新的实例对象)
e、getType(处于不同的类时使用,返回的实例对象的类型是Type)
f、newType(同getType,返回新的实例对象)
二、遇到多个构造器参数时要考虑用构建器
1、重叠构造器(telescoping constructor)模式:第一构造器只包含必要的参数,后面的构造器依次叠加可选参数。
2、JavaBeans模式:无参的构造器构造对象,调用setter方法来设置必要的参数和可选参数。
3、Builder模式:不直接生成想要的对象,让客户端利用必要的参数来调用构造器(或静态工厂),得到一个builder对象,然后客户端在builder对象上调用类似于setter的方法,来设置可选参数。最后,客户端调用无参的build方法来生成不可变的对象。
4、设置了参数的builder生成了一个很好的抽象工厂。客户端将一个builder传给方法,该方法能够为客户端创建一个或多个对象。
5、构建器的缺点:
a、为了创建对象,必须要先创建构建器,带来性能损耗
b、使用过程比重叠构建器模式更加冗长。
6、使用时机:类的构造器或者静态工厂中具有多个参数,特别是含有大多数参数都是可选的时候,Builder模式是不错的选择。
三、用私有构造器或者枚举类型强化Singleton属性
1、仅被实例化一次的类,称为Singleton,代表本质上唯一的系统组件。Singleton会使它的客户端测试变得十分困难。
2、实现Sigleton的三种方法:
a、公有静态成员是个final域(自己保证序列化,需要额外的操作:比如transient所有实例域,提供readResolve方法等)
b、公有静态工厂方法(自己保证序列化,需要额外的操作:比如transient所有实例域,提供readResolve方法等)
c、只包含一个元素的枚举类型。(最佳方法)
四、通过私有构造器强化不可实例化的能力
五、避免创建不必要的对象
1、注意避免过度问题,除非对象是重量级的,或者没有必要维护自己的对象池。
六、消除过期的对象引用
1、如果类是自己管理内存,就应该要警惕内存泄漏问题。
2、内存泄漏的另一个常见来源是缓存,使用WeakhashMap可以解决部分问题
3、内存泄漏的第三个来源是监听器和其他回调。WeakHashMap可以解决部分问题。
七、避免使用终结方法
1、除非是为了作为安全网,或者为了终止非关键的的本地资源,否则不使用终结方法。注意“终结方法链”不会自动执行,需要自己调用super.finalize方法。或者对于公有的非final类,考虑使用总结方法守卫者。
Effective Java 学习笔记之创建和销毁对象的更多相关文章
- 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象
- 《Effect Java》学习笔记1———创建和销毁对象
第二章 创建和销毁对象 1.考虑用静态工厂方法代替构造器 四大优势: i. 有名称 ii. 不必在每次调用它们的时候都创建一个新的对象: iii. 可以返回原返回类型的任何子类型的对象: JDBC ...
- effective java 第2章-创建和销毁对象 读书笔记
背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...
- Effective Java——(一)创建和销毁对象
第一条 考虑用静态工厂方法代替构造器 什么叫静态工厂方法,就是通过在类中通过静态方法对对象初始化. 比如说 public class StaticFactory { private String na ...
- Effective Java(一)—— 创建和销毁对象
在客户端(调用端)获取自身实例的方法: 公有的构造器: 类的静态工厂方法: 1. 使用静态工厂方法代替构造器 Boolean 是对基本类型 boolean 的包装类: public final cla ...
- 【Effective Java】第二章-创建和销毁对象——1.考虑用静态工厂方法代替构造器
静态工厂方法的优点: 可以赋予一个具有明确含义的名称 可以复用唯一实例,不必每次新建 可以返回原实例类型的子类对象 可以在返回泛型实例时更加简洁 缺点: 类如果不含有共有的或者受保护的构造器,就不能被 ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
随机推荐
- javascript中对象字面量的理解
javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...
- 菜鸟之linux问题之图形界面和dos界面的登录问题
1.安装完linux系统后,图形化界面的用户名和密码是之前安装的时候设置的. 如果想切换到linux的dos窗口快捷键是:ctrl+alt+F2 由dos窗口切换到linux图形界面快捷键是:ctrl ...
- UML活动图与流程图的区别
http://blog.chinaunix.net/uid-11572501-id-3847592.html UML活动图与流程图的区别 (1).流程图着重描述处理过程,它的主要控制结构是顺序.分支和 ...
- 加载信息,先从数据库取出5条实现分页,鼠标向上滑动触发Ajax再加载5条,达到异步刷新,优化加载。。。
php数据库取数据 <?php include("conn1.php"); include('../function/functions.php'); $page=intva ...
- Kafka集群的安装和使用
Kafka是一种高吞吐量的分布式发布订阅的消息队列系统,原本开发自LinkedIn,用作LinkedIn的活动流(ActivityStream)和运营数据处理管道(Pipeline)的基础.现在它已被 ...
- 英文论文中i.e.,e.g.,etc.,viz.的简要小结
英文论文中i.e.,e.g.,etc.,viz.的简要小结 看了一堆用法,全白扯,自己总结的最好记,最实用 i.e. =即.换句话说.也就是说."'In essence' or 'in ot ...
- 几个有用的JavaScript/jQuery代码片段(转)
1. 检查数据是否包含在Array中 //jQuery实现 jQuery.inArray("value", arr); // 使用方法: if( jQuery.inArray(&q ...
- ecshop 快速添加会员
/*------------------------------------------------------ */ //-- 快速添加会员 /*-------------------------- ...
- HTML \ XHTML \XML 的区别
虽然是很简单的知识,但如果总是在需要的时候去查找,不需要的时候就丢掉,未免心里总是觉的不踏实.因为你就像是垃圾收购站,有垃圾(知识)就往里面拖,拖不下了就丢掉一些(忘了).不去整理,也因此也不知道丢的 ...
- List.Sort用法
treeList.Sort((x, y) => x.SortIndex < y.SortIndex ? -1 : 0);