- 序:什么是静态工厂方法
- Effective Java
- 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名字
- 2.2 第二个优势,不用每次被调用时都创建新对象
- 2.3 第三个优势,可以返回原返回类型的子类
- 2.4 第四个优势,在创建带泛型的实例时,能使代码变得简洁
- 除此之外
3.1 可以有多个参数相同但名称不同的工厂方法
3.2 可以减少对外暴露的属性
3.3 多了一层控制,方便统一修改 - 总结
1. 序:什么是静态工厂方法
在 Java 中,获得一个类实例最简单的方法就是使用 new
关键字,通过构造函数来实现对象的创建。
就像这样:
Fragment fragment = new MyFragment(); // or Date date = new Date();
不过在实际的开发中,我们经常还会见到另外一种获取类实例的方法:
Fragment fragment = MyFragment.newIntance(); // or Calendar calendar = Calendar.getInstance(); // or Integer number = Integer.valueOf("3");
↑ 像这样的:不通过 new
,而是用一个静态方法来对外提供自身实例的方法,即为我们所说的 静态工厂方法(Static factory method)
。
知识点: new
究竟做了什么?
简单来说:当我们使用 new 来构造一个新的类实例时,其实是告诉了 JVM 我需要一个新的实例。JVM 就会自动在内存中开辟一片空间,然后调用构造函数来初始化成员变量,最终把引用返回给调用方。
2. Effective Java
在关于 Java 中书籍中,《Effective Java》绝对是最负盛名几本的之一,在此书中,作者总结了几十条改善 Java 程序设计的金玉良言。其中开篇第一条就是『 考虑使用静态工厂方法代替构造器 』,关于其原因,作者总结了 4 条(第二版),我们先来逐个看一下。
2.1 静态工厂方法与构造器不同的第一优势在于,它们有名字
由于语言的特性,Java 的构造函数都是跟类名一样的。这导致的一个问题是构造函数的名称不够灵活,经常不能准确地描述返回值,在有多个重载的构造函数时尤甚,如果参数类型、数目又比较相似的话,那更是很容易出错。
比如,如下的一段代码 :
Date date0 = new Date(); Date date1 = new Date(0L); Date date2 = new Date("0"); Date date3 = new Date(1,2,1); Date date4 = new Date(1,2,1,1,1); Date date5 = new Date(1,2,1,1,1,1);
—— D