正在阅读:细述Java技术开发规则--基本篇细述Java技术开发规则--基本篇

2005-07-21 10:16 出处: 作者:flyingwcy 责任编辑:moningfeng

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 ();
}


  参考:Nigel Warren, Philip Bishop: "Java in Practice - Design Styles and Idioms for Effective Java". Addison-Wesley, 1999. pp.110-111

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品