Effective Java读书笔试之创建和销毁对象 博客分类: effective java effectivejava
Effective Java读书笔试之创建和销毁对象
1.考虑用静态工厂方法代替构造函数
静态工厂方法的第一个好处是,与构造函数不同,静态工厂方法有名字,接口有更好的类型表达能力。
静态工厂方法的第二个好处是,与构造函数不同,它每次被调用的时候,不要求非得创建一个新的对象,特别是对于不变对象而言,可以在被调用时返回同一个对象的引用,重用对象.
public static Boolean valueOf(boolean b){ return (b?Boolean.TRUE:Boolean.FALSE); }
静态工厂方法的第三个好处是,与构造函数不同,它们可以返回一个子类型的对象(接口)。
2.使用私有构造函数强化singleton属性
实现singleton有两种方法,这两种方法都要把构造函数保持为private,并且提供一个公有静态成员,对外提供访问路径。
一种方法是使用公有final静态成员
public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis(){ } }
二种方法是提供一个静态工厂方法,而不是final static域。
public class Elvis{ private static final Elvis INSTANCE = new Elvis(); public static Elvis getInstance(){ return INSTANCE; } }
3.私有构造函数强化不可实例化的能力
有些工具类(utility class,内部成员大部是静态方法,静态属性)不希望被实例化,进行实例化也没有任何意义,可以通过让这个类定义一个显式的私有构造函数确定它不被实例化。
这种作法的一个副作用是一个类不能被继承,因为没有构造函数可以被子类调用。
4.避免创建重复的对象
对一个非可变的对象,它总是可以被重用的。
在循环中String str = new String("silly");每次循环总是会创建一个新的但是又不变的对象,很浪费;而使用String str = "silly";
则每次循环中不会创建新的对象,会重用字符串池中的"silly".
对于非可变对象可以提供静态工厂方法来重用同一个非可变对象。
5.消除过期的对象引用
如果一个对象引用被无意识地保留起来,那么垃圾回收机制不仅不会处理这个对象,而且也不会处理这个对象引用的所有其他对象。
一个例子是Stack中使用Object elements[]数组来存储元素,在pop操作时,只是return elements[--size];此时elements[--size]还是存储着对返回对象的引用,这个对象被无意识的引用在elements[--size]位置上,导致垃圾回收机制没有办法回收此元素。
修复这类问题很简单:如果对象引用过期,只需清空这些引用就可以了。
应该修改pop代码:
Object result = elements[--size];
elements[size] = null; return result;
6.避免使用终结函数
Java虚拟机不保证终结函数会被及时地执行,而且也根据不保证它们会被执行,所以如果资源的释放依赖于终结函数执行的时间点,将是不可靠的。避免使用finalize()方法.
如果一个类的封装资源需要回收,一个方法是提供一个显式的终止方法,并要求此类的客户端在每个实例不再有用的时候调用这个方法。实例必须要记录下自己是否已经被终止,如果这个对象已终被终止之后,还被调用的话,就应该抛出IllegalStateException异常。
一个典型的实例:
InputStream和OutputStream的close()方法
显式的终止方法通常与try-finally结合起来使用,以确保及时终止,也就是说不论什么情况下,资源释放的终止函数都会被调用执行.
Foo foo = new Foo();
try{ //DO what must be done with foo }finally{ foo.terminate(); }