Effective Java 创建和销毁对象 1.考虑用静态工厂方法代替构造器
2017-08-23 12:13
495 查看
Effective Java
作者简介:Joshua Bloch是Sun公司的高级工程师,也是“Java平台核心组”的设计师。他设计并实现了获奖的Java Collections Framework和java.math软件包,并且对Java平台的其他部分也做出了贡献。Joshua是许多技术文章和论文的作者,他的关于抽象数据对象复制的博士论文获得过“ACM杰出博士论文奖”提名。他拥有哥伦比亚大学的学士学位和卡耐基-梅隆大学的博士学位。
java之父James Gosling 评价:我很希望十年前就拥有这本书。可能有人认为我不需要任何java方面的书籍,但我需要这本书。
四大名著
Java编程语言-------James Gosling(Java之父)
Java编程思想-------Bruce Eckel
Java 2核心技术-----Cay Horstmann
Effective Java-----Joshua Bloch
四大名著的网上有很多下载链接,中文版、英文版、源码。尽管如此我还是推荐直接买实体书。
对于英文阅读能力差的,一定要多看英文版,毕竟作者跟翻译不是同一个人,总会有出入;英文阅读能力好的直接看英文版,顺便过几遍中文版,意思向左的一定要自己验证。
创建和销毁对象 1.考虑用静态工厂方法代替构造器
使用静态工厂方法代替构造器,问题来了,什么是静态工厂方法?什么是构造器?
二者之间肯定有相同点,不然就不存在代替。
相同点:定义一个用于创建对象的接口,返回类的实例。
public class Person {
static Person mPerson;
public Person() {// 构造方法
}
public static Person getPerson01() {// 静态方法 01
return new Person();
}
public static Person getPerson02() {// 静态方法 02
if (mPerson == null) {
return new Person();
}
return mPerson;
}
}
相对于构造器,静态工厂方法的优缺点。
一.优点
1、静态工厂方法有名称。
构造器是Java一种规定写法,方法名就是类名,当构造器过多时,区别在于参数的多寡。
静态工厂方法 getPerson() ,可以随意命名,不过是在遵循命名规范的前提下。
2、静态工厂方法不必在每次调用它们的时候都创建一个新的对象。
构造器肯定是返回一个新的实例,而静态工厂方法02中当person为null才会返回新实例,不过这种写法不安全。
3、静态工厂方法可以返回原返回类型的任何子类型
public class Person {
public static final int KEY = 301;
private Person() {// 私有构造方法
}
public static Map<Integer, Man> mMap = new HashMap<>();//通过键值对保存接口对象
public interface Man {//接口
Person getPerson();
}
public static Person newPerson() {
return newPerson(KEY);
}
private static Person newPerson(int key) {
Man man = mMap.get(KEY);
if (man == null) {
return new Person();
}
return man.getPerson();
}
}
返回对象有很大的灵活性,只需要根据mMap的键。隐藏类的实现,适合于编写框架,框架会生成API,API就简洁化了。
4、静态工厂方法在创建参数化的类型实例的时候,它们使得代码变得更加简洁。在调用参数化类的构造器的时候
Map<String, List<String>> m = new HashMap<String, List<String>>(); //实例化
定义静态工厂方法,编译器替你找到参数类型,也就是所谓的类型推导。
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
Map<String, List<String>> m = HashMap.newinstance();
二、缺点
1、类如果不含公有的或者受保护的构造器,就不能被子类化。
这个就是Java机制,主要目的就是鼓励程序员复合而不是继承。
2、静态工厂方法与其他的静态方法实际上没有任何区别。
其实它就是静态方法,所以在API中,没有明确的标注。在API有构造方法专栏,而静态工厂方法只能在方法区域。
弥补缺点:习惯用名(复制的)
valueOf :不太严格的讲,这个方法返回的实例与它的参数具有
4000
相同的值。实际这只是做了一个类型转换。
of:valuefOf的一种简洁的替代,在EnumSet中使用并流行起来。
getInstance:返回的实例是通过方法的参数来描述的,但是不能说与参数具有同样的值。参于Singleton来说,该方法就没有参数,并总是返回唯一的实现。
newInstance:像getInstance一样,但newInstance能够确保返回的每个实例都与所有其他的实例不同。
getType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。
newType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。
作者简介:Joshua Bloch是Sun公司的高级工程师,也是“Java平台核心组”的设计师。他设计并实现了获奖的Java Collections Framework和java.math软件包,并且对Java平台的其他部分也做出了贡献。Joshua是许多技术文章和论文的作者,他的关于抽象数据对象复制的博士论文获得过“ACM杰出博士论文奖”提名。他拥有哥伦比亚大学的学士学位和卡耐基-梅隆大学的博士学位。
java之父James Gosling 评价:我很希望十年前就拥有这本书。可能有人认为我不需要任何java方面的书籍,但我需要这本书。
四大名著
Java编程语言-------James Gosling(Java之父)
Java编程思想-------Bruce Eckel
Java 2核心技术-----Cay Horstmann
Effective Java-----Joshua Bloch
四大名著的网上有很多下载链接,中文版、英文版、源码。尽管如此我还是推荐直接买实体书。
对于英文阅读能力差的,一定要多看英文版,毕竟作者跟翻译不是同一个人,总会有出入;英文阅读能力好的直接看英文版,顺便过几遍中文版,意思向左的一定要自己验证。
创建和销毁对象 1.考虑用静态工厂方法代替构造器
使用静态工厂方法代替构造器,问题来了,什么是静态工厂方法?什么是构造器?
二者之间肯定有相同点,不然就不存在代替。
相同点:定义一个用于创建对象的接口,返回类的实例。
public class Person {
static Person mPerson;
public Person() {// 构造方法
}
public static Person getPerson01() {// 静态方法 01
return new Person();
}
public static Person getPerson02() {// 静态方法 02
if (mPerson == null) {
return new Person();
}
return mPerson;
}
}
相对于构造器,静态工厂方法的优缺点。
一.优点
1、静态工厂方法有名称。
构造器是Java一种规定写法,方法名就是类名,当构造器过多时,区别在于参数的多寡。
静态工厂方法 getPerson() ,可以随意命名,不过是在遵循命名规范的前提下。
2、静态工厂方法不必在每次调用它们的时候都创建一个新的对象。
构造器肯定是返回一个新的实例,而静态工厂方法02中当person为null才会返回新实例,不过这种写法不安全。
3、静态工厂方法可以返回原返回类型的任何子类型
public class Person {
public static final int KEY = 301;
private Person() {// 私有构造方法
}
public static Map<Integer, Man> mMap = new HashMap<>();//通过键值对保存接口对象
public interface Man {//接口
Person getPerson();
}
public static Person newPerson() {
return newPerson(KEY);
}
private static Person newPerson(int key) {
Man man = mMap.get(KEY);
if (man == null) {
return new Person();
}
return man.getPerson();
}
}
返回对象有很大的灵活性,只需要根据mMap的键。隐藏类的实现,适合于编写框架,框架会生成API,API就简洁化了。
4、静态工厂方法在创建参数化的类型实例的时候,它们使得代码变得更加简洁。在调用参数化类的构造器的时候
Map<String, List<String>> m = new HashMap<String, List<String>>(); //实例化
定义静态工厂方法,编译器替你找到参数类型,也就是所谓的类型推导。
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
Map<String, List<String>> m = HashMap.newinstance();
二、缺点
1、类如果不含公有的或者受保护的构造器,就不能被子类化。
这个就是Java机制,主要目的就是鼓励程序员复合而不是继承。
2、静态工厂方法与其他的静态方法实际上没有任何区别。
其实它就是静态方法,所以在API中,没有明确的标注。在API有构造方法专栏,而静态工厂方法只能在方法区域。
弥补缺点:习惯用名(复制的)
valueOf :不太严格的讲,这个方法返回的实例与它的参数具有
4000
相同的值。实际这只是做了一个类型转换。
of:valuefOf的一种简洁的替代,在EnumSet中使用并流行起来。
getInstance:返回的实例是通过方法的参数来描述的,但是不能说与参数具有同样的值。参于Singleton来说,该方法就没有参数,并总是返回唯一的实现。
newInstance:像getInstance一样,但newInstance能够确保返回的每个实例都与所有其他的实例不同。
getType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。
newType:像getInstance一样,但是在工厂方法处于不同的类型的时候使用。Type表示工厂方法所返回的对象类型。
相关文章推荐
- 创建和销毁对象 第一条:考虑用静态工厂方法代替构造器
- 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
- 1. 【创建与销毁对象】考虑用静态工厂方法代替构造器
- Effective Java - 创建和销毁对象 - 静态工厂方法代替构造器
- 创建和销毁对象(1)——考虑用静态工厂方法代替构造器
- 创建和销毁对象 - 考虑用静态工厂方法代替构造器
- 第1条 创建和销毁对象——考虑用静态工厂方法代替构造器
- 第1条:考虑用静态工厂方法代替构造器(第一章:创建和销毁对象)
- 优先用静态方法创建对象,考虑用静态工厂方法代替构造器
- 创建和销毁对象之用静态工厂方法代替构造器
- 创建和销毁对象--考虑用静态工厂方法代替构造函数
- Effective Java 第一条:考虑用静态工厂方法代替构造器
- Effective Java 读书笔记——1:考虑用静态工厂方法代替构造器
- Effective Java 中文版之学习 第1条:考虑用静态工厂方法代替构造器
- 1、考虑用静态工厂方法代替构造器(effective java)
- 《Effective Java》考虑用静态工厂方法代替构造器
- 《Effective Java》-考虑用静态工厂方法代替构造器
- Effective Java (1) - 考虑用静态工厂方法代替构造器
- Effective Java 第一条:考虑用静态工厂方法代替构造器
- 【Effective Java学习】创建和销毁对象--考虑用静态方法代替构造器