细述Java技术开发规则--基本篇(2)
5.经常从finalize ()中调用super.finalize () 这里的finalize ()是java在进行垃圾收集的时候调用的,和finally不一样。如果你的父类没有定义finally()的话,你也应该调用。这里有两个原因:(1)在不改变代码的情况下能够将父类的finally方法加到你的类中。 (2)以后你会养成习惯调用父类的finally方法,即使父类没有定义finally方法的时候。 正确的方法应该如此:public class parentFinalize{protected void finalize () throws Throwable {super.finalize();// FIXED } 参考:"The Java Programming Language" by Ken Arnold and James Gosling, page 49.6.不要在finalize ()中注销listeners 不要再finalize ()方法中中注销listeners,finalize ()只有再没有对象引用的时候调用,如果listeners从finalize()方法中去除了,被finalize的对象将不会在垃圾收集中去除。public void finalize () throws Throwable{bButton.removeActionListener (act); }7.不要显式的调用finalize ()方法 虽然显式的调用这个方法可以使你确保你的调用,但是当这个方法收集了以后垃圾收集会再收集一次。public class T7 { public void finalize() throws Throwable{ close_resources (); super.finalize (); } public void close_resources() {} } class Test{ void cleanup () throws Throwable{ t71.finalize(); // 调用 t71 = null; } private t71 = new T7 (); } 对于这样的调用我们应该自己创建一个释放的方法,做最初finalize ()所作的事情,当你每次想显式的调用finalize ()的时候实际上调用了释放方法。然后再使用一个判断字段来确保这个方法只执行一次,以后再调用就没关系了。public class T7 { public synchronized void release () throws Throwable{ if (!_released) { close_resources ();// do what the old ‘finalize ()‘ did _released = true; } } public void finalize () throws Throwable{ release (); super.finalize (); } public void close_resources() {} private boolean _released = false; } class TestFixed{ void closeTest () throws Throwable { t71 .release ();// FIXED t71 = null; } private T7 t71 = new T7 (); }
首页 上页 | 1 | 2 | 3 | 下页 尾页 共 3 页