Effective java:创造和销毁对象
一、创建和销毁对象
1、用静态工厂方法代替构造函数
优点:
1)静态方法有名字、易于使用
public final class Boolean{
//构造函数
public Boolean(boolean value) {
this.value = value;
}
//静态方法
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
}
2)每次被调用不一定要创建新的对象
可以返回同一个对象、单例。
3)可以返回一个原返回类型的子类的对象。
缺点:
1)如果构造方法是私有的、就不能被继承
2)与其它静态方法不能区别开、不像构造方法那样被明确标识出来。
valueOf
getInstance
2、使用私有构造器强化singleton属性
两种方式:
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis{}
}
public class Elvis1{
private static final Elvis1INSTANCE = new Elvis1();
private Elvis1{}
public static Elvis1 getInstance(){
return INSTANCE ;
}
}
3、通过私有构造器强化不可实例化能力
4、避免创建重复的对象
重复使用同一个对象,而不是每次使用的时候创建一个功能上等价的新对象。
String s = new String("silly");//Don't do this!
String s = "silly";//yes!
5、消除过期的对象引用
public class Stack {
private Object[] elements;
private int size = 0;;
public void push(Object o) {
if (size > 9)
throw new IllegalArgumentException();
ensureCapacity();
elements[size++] = o;
}
public Stack(int initialCapacity) {
elements = new Object[initialCapacity];
}
public Object pop() {
if (size == 0)
throw new EmptyStackException();
//减少内存的活动范围
Object 0 =elements[--size];
//让垃圾回收器回收过期引用
elements[size] = null;
return 0 ;
}
private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
elements[--size]这段代码一开始看了没弄明白,原文说这是将对象弹出。
结合ArrayList的remove 方法大概理解意思
Stack 自己管理着 elements里元素的存取、增删操作
当执行elements[--size]时,Stack的size被减少了,elements的length却没有减少
但是 elements 中 将有个元素成为不可利用的垃圾(原文中说是 过期的引用)。
因为Stack的size属性决定着elements数组的可访问范围
(相当于ArrayList的size属性,当访问的下标超过size的大小会抛出越界异常)。
6、避免使用终结函数