Effective Java Sencond Edition

Effective Java 第7条: 避免使用终结方法

2018-12-26  本文已影响0人  linyk3

终结方法(finalizer) 通常是不可预测的,也是很危险的,一般情况下是不必要的.

不要把终结方法当做是C++中的析构器的对应物:
C++ 需要析构器来与构造器对应,来回收对象所占的资源.
Java 中内存资源由垃圾收集器处理, 非内存资源由 try-finally 处理.

终结方法的缺点:

如果 类的对象中封装的资源 (文件或者线程)确实需要终止,可以采用: 显式的终止方法 + try-finally

显式的终止方法,例如 InputStream, OutputString 和 java.sql.Connection 上的 close 方法.
在finally 里调用显式的终止方法,可以保证即使在使用对象时有异常抛出,该终止方法也会执行.

Foo foo = new Foo(...);
try {
    // Do what must be done with foo
    ...
} finally {
    foo.terminate();  // Explicit termination method
}

终结方法的两种合法用途:

注意:终结方法链不会被自动执行.如果类有终结方法,并且子类覆盖了终结方法, 子类的终结方法就必须手动调用超类的终结方法.

@override
protected void finalize() throws Throwable {
    try {
        ... // Finalize subclass state
    } finally {
        super.finalize();
        ... //
    }
}

如果子类覆盖了超类的终结方法,但是忘了调用超类的终结方法,那么超类的终结方法将永远不会被调用到.

总之,除非是作为安全网,或者为了终结非关键的本地资源,否则请不要使用终结方法.
如果使用了终结方法,记得super.finalize()

上一篇 下一篇

猜你喜欢

热点阅读