2012-07-07 56 views
7

我读(某处)finalize()不保证当子类被垃圾收集时调用父类,这是否意味着大多数开发人员覆盖子类中的finalize()并调用super.finalize()你是否在子类中调用super.finalize()?

+6

有效的Java - 项目7:避免终结器。如果你确实使用了终结器,你应该调用super.finalize()。 – assylias 2012-07-07 22:26:46

+0

那么当子类被垃圾收集时,finalize()会被调用超类吗? – user997112 2012-07-07 22:29:50

+3

伟大的文章,我认为有相关性:[为什么Finalize保护](http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/)。 – 2012-07-07 22:30:43

回答

13

Finalize不会自动调用超类。所以,如果你重写敲定,以确保超类的正确方法得到清理将

protected void finalize() { 
    try { 
     // do subclass cleanup 
    } 
    finally { 
     super.finalize(); 
    } 
} 

看到这个参考文章http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html

应该值得注意的是,终结不是很容易预测而你不知道对他们是否运行有任何控制。在最终确定方法中不应该做任何关键的事情。一般来说,最好只是对班级进行明确的清理。

3

最好避免依靠finalize清理任何非Java资源(不保证完成调用)。如有可能,请尝试使用资源(如果使用JDK7)或尝试最终子句以尽可能地清理其他选项中的资源。如果您要使用finalize,您可以将super.finalize放入try finally块中。不依靠敲定来清理资源是明智的。

// don't make it public! 
protected void finalize() throws Throwable 
{ 
    try 
    { 
    // custom finalization here 
    } 
    finally 
    { 
    super.finalize(); 
    } 
} 

如果这个想法是清理资源,这将是明智的,也许看看虚引用 - 对象是虚可如果它既不强/弱/软可及,已经敲定&有在至少一个幻影参考(即对象已完成但尚未回收)。

相关问题