Effective java:创造和销毁对象

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、避免使用终结函数