卸载静态字段

时间:2011-11-19 17:46:15

标签: java static initialization

我有一个java类,它使用复杂的静态字段,需要close()的特殊操作,以便GC安全地清除它们。

对于静态字段的初始化,我使用static块。但我现在不知道如何安全地卸载静态字段,这样我就可以在GC清理字段之前调用close()方法。

有没有办法卸载静态字段,类似于静态初始化块?

5 个答案:

答案 0 :(得分:8)

没有办法做你要求的事情,因为静态块在加载类时被初始化,而finalize()仅适用于对象。

考虑使用Singleton类及其实例替换静态变量及其中的复杂操作。

这样,您就可以使用finalize()方法执行close()操作。

答案 1 :(得分:3)

private static Uninit cleanup = new Uninit();
....
private static class Uninit { 
    public Uninit() {} 

    public void finalize() {

                     //whatever you need done

    }
}

答案 2 :(得分:2)

在网络应用中,您可以使用ServletContextListener

答案 3 :(得分:1)

您可以设置shutdown hook来完成此操作,但您可能无法完成所有操作。您可能已经耗尽了内存,或者该过程可能已经被杀死而没有它有机会进行清理等等。

最好确保数据一致性不依赖于此代码和/或将其移动到在应用程序生命周期内定期清理的代码。

答案 4 :(得分:-2)

没有。

静态类在您第一次使用时会在运行时加载,并且只在程序退出时才会卸载(afaik)。

所以你可以在类本身中创建一个静态方法close来清理静态成员,并在你退出时调用它。