本篇主要总结的是《Effecticve Java》中关于创建和销毁对象的内容。
比如:
- 何时以及如何创建对象
- 何时以及如何避免创建对象
- 如何确保及时销毁
- 如何管理对象销毁前的清理动作
考虑用静态工厂方法代替构造器
使用静态工厂的优势:
- 有名称
- 不必每次调用的时候都创建一个新的对象
- 返回原返回类型的任何子类型对象
- 在创建参数化类型实例时,代码更加简洁。
使用静态工厂的缺点:
- 类如果不包含公有的或者受保护的构造器,就不能被子类化
- 与其他的静态方法实际上没有任何区别
举个例子:
public class Apple{ public Apple(String type){} public static Apple newInstance(){ return new Apple("qing"); }}//使用的时候直接newInstance就可以Apple.newInstance();
常用的静态工厂名称:valueOf
,of
,getInstance
,newInstance
,getType
,newType
.
遇到多个构造器参数时考虑使用构建器
如果参数很多,在使用的时候也会很繁琐。比如
new Person(name,age,address,tel,gender);
当参数大于三个的时候,就可以考虑使用构建器了,特别实在参数可选的时候。
public class Person{ public Person name(String name){return this;} public Person age(String age){return this;} public Person gender(String gender){return this;} public Person tel(String tel){return this;}}//使用的时候可以这样用(new Person()).name("xingoo").age(30).gender("male").tel(13333333333);
使用构建器的缺点就是代码会比较冗长。
用私有构造器或者枚举类型强化Singleton属性
第一种方式,是饿汉模式:
publci class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis(){} public void xxx(){}}
另一种方式,属于懒汉模式:
public class Elvis{ private static Elvis INSTANCE; private Elvis(){} public static Elvis getInstance(){ if(INSTANCE == null) INSTANCE = new Elvis(); return INSTANCE; } xxx}
通过私有构造器强化不可实例化的能力
有一些比如工具类,是不想被实例化的,可以使用私有的构造方法,来避免实例化:
public class XXUtil{ private XXUtil(){}}
缺点是这样的类无法被子类化。
避免创建不必要的对象
尽量应该避免创建不必要的对象,比如:
String s = new String("xxx");
其实创建了两个字符串对象。
尽量优先使用long这种基本类型。
消除过期的对象引用
常见的是在栈操作,出栈操作并不意味着释放对象。
public Object pop(){ if(size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; return result;}
避免使用终结方法
finalizer方法是再垃圾回收的时候触发的,因此不能准确的知道终结方法调用的时间。因此最好是在try catch finally的时候释放对象。
这种释放对象的时机,叫做显示终止方法。