什么是在Java中清理对象的最佳方法?

58 浏览
0 Comments

什么是在Java中清理对象的最佳方法?

在 Java 中,我们没有像 C++ 中那样的析构函数。

问题1:在 Java 中应该如何清理对象。

问题2:有没有finally块的替代方案。

问题3:有时我们需要从我们的类中显式调用第三方代码的初始化/终止,例如:

public classs MyClass{
    public MyClass(){
        ThirdPartyInitialize();
    }
    protected void finalize(){
        ThirdPartyTerminate();
    }
}

这样做是正确的吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

如果您的程序也要关闭,您还可以向您的程序添加关闭钩子(shutdown hook)

//add shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        ThirdPartyTerminate();
    }
});

0
0 Comments

通常情况下,你不能自己“清理”Java对象。垃圾收集器决定何时清理对象。你可以通过将对象引用设置为null来表明你已经完成了对该对象引用的使用,但通常只要让它超出作用域就足够了。无论哪种方式,你仍然无法控制何时进行垃圾回收。\n\nfinally块用于在try块抛出异常与否时执行操作,是执行清理工作的最佳位置。通常只会对非对象资源(如打开的流)进行清理。\n\nfinalize()不能保证被调用,因为垃圾回收器不能保证在程序退出之前被调用。它并不像C++中的析构函数一样,因为C++构造函数总是被调用并且你可以依赖它们被调用。你无法依赖finalize()被调用。\n\n因此,1)使用finally块释放非对象资源 2)让垃圾回收器清理对象资源 3)如果在长时间运行的方法中使用对象,并且表示已经完成对它的使用,则可以将其设置为null以提示垃圾回收器。

0