第1条 创建和销毁对象——考虑用静态工厂方法代替构造器
2016-05-03 13:43
525 查看
创建类的实例时最常见的也是最简单的一个方法就是使用new,此外还可以使用静态工厂方法来封装实例的细节,控制实例的数量,减轻jvm的堆栈中的压力。
1、静态工厂方法相比较于构造器的第一大优势是它们有名称,具有见名知意的优点,可以提高程序代码的可读性。当一个类需要多个带有相同签名的构造器时,我们应该优先考虑使用静态工厂方法来代替构造器,并且慎重地选择方法名称以便于突出它们之间的区别。
如果需要在其它类中调用TottiStaticDemo类中的outPutStatic方法,那么只要使用如下语句即可:
而不必使用new关键字。
2、静态工厂方法相比较于构造器的第二大优势是不必在每次调用它们的时候都去创建一个新的对象,是否创建一个新的对象取决于方法的实现。
3、静态工厂方法相比较于构造器的第三大优势是它可以返回当前类的子类的实例,而new语句只能创建当前类的实例。
4、静态工厂方法相比较于构造器的第四大优势是它在创建参数化类型实例的时候可以使代码变得更加简洁。遗憾的是,在调用参数化类的构造器时,即使类型参数很明显,也必须指明。这通常要求你接连两次提供类型参数:
随着类型参数变得越来越长,越来越复杂,这一冗长的说明也很快变得痛苦起来。但是有了静态工厂方法,编译器就可以自己找到类型参数。这被称做类型推导。例如,假设HashMap提供了这个静态工厂:
那么我们就可以用下面这句简洁的代码代替上面这段繁琐的声明:
5、静态工厂方法的缺点:
1)如果类不含有公有的或者受保护的构造器,就不能被子类化。
2)采用构造函数实例化对象,是语言的规范,而静态工厂方法与其他的静态方法实际上没有任何区别,只是增加了用户使用的区别。但是这可以尽量采用一些家喻户晓的名字解决,让用户一看到该名字就知道该方法是静态工厂方法。如getInstance()。
1、静态工厂方法相比较于构造器的第一大优势是它们有名称,具有见名知意的优点,可以提高程序代码的可读性。当一个类需要多个带有相同签名的构造器时,我们应该优先考虑使用静态工厂方法来代替构造器,并且慎重地选择方法名称以便于突出它们之间的区别。
eg:public class TottiStaticDemo{ privatestatic final TottiStaticDemo demo = new TottiStaticDemo(); publicstatic TottiStaticDemo getInstance(){ return demo; } publicvoid outPutStatic(){ System.out.println("Test StaticFactory Class!"); } }
如果需要在其它类中调用TottiStaticDemo类中的outPutStatic方法,那么只要使用如下语句即可:
<span style="white-space:pre"> </span>TottiStaticDemo.getInstance().outPutStatic();
而不必使用new关键字。
2、静态工厂方法相比较于构造器的第二大优势是不必在每次调用它们的时候都去创建一个新的对象,是否创建一个新的对象取决于方法的实现。
3、静态工厂方法相比较于构造器的第三大优势是它可以返回当前类的子类的实例,而new语句只能创建当前类的实例。
4、静态工厂方法相比较于构造器的第四大优势是它在创建参数化类型实例的时候可以使代码变得更加简洁。遗憾的是,在调用参数化类的构造器时,即使类型参数很明显,也必须指明。这通常要求你接连两次提供类型参数:
Map<String,List<String>> m= newHashMap<String,List<String>>();
随着类型参数变得越来越长,越来越复杂,这一冗长的说明也很快变得痛苦起来。但是有了静态工厂方法,编译器就可以自己找到类型参数。这被称做类型推导。例如,假设HashMap提供了这个静态工厂:
public static <k,v> HashMap<k,v>newInstance(){ returnnew HashMap<k,v>() }
那么我们就可以用下面这句简洁的代码代替上面这段繁琐的声明:
Map<String,List<String>> m=HashMap. newInstance();
5、静态工厂方法的缺点:
1)如果类不含有公有的或者受保护的构造器,就不能被子类化。
2)采用构造函数实例化对象,是语言的规范,而静态工厂方法与其他的静态方法实际上没有任何区别,只是增加了用户使用的区别。但是这可以尽量采用一些家喻户晓的名字解决,让用户一看到该名字就知道该方法是静态工厂方法。如getInstance()。
相关文章推荐
- Python datetime compare
- Programming Clojure笔记之一——入门
- es2.2.0 无法将ik设置为默认analyzer
- CORS(跨域访问) 服务端流程图
- 一、什么是正则表达式
- mac显示隐藏文件夹
- OpenGL学习之路(二)
- ViewPager动态变换效果之SCViewPager源码解析
- 删除Xcode插件
- jsp实现单刷时间显示,刷新显示时间不刷新页面
- OpenGL学习之路(三)
- SQL大圣之路笔记——SQL TRUNCATE,DELETE,DROP
- Android Binder通信机制学习
- Cookie
- [Lesson Learn] LeetCode #2 Add Two Numbers
- 使用Autolayout实现UITableView的Cell动态布局和高度动态改变
- 监听器
- VBA: Cant find project or librar
- 简单粗暴地理解js原型链--js面向对象编程
- 系统调用和库函数及API的区别