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

pan*_*ajt 18 java

我们在Java中没有像Java一样的Java中的析构函数.

Q1.我们应该如何清理java中的任何Object.

Q2.是否有替代finally块.

Q3.有时我们必须从我们的类中明确地调用初始化/终止第三方代码,例如

public classs MyClass{
    public MyClass(){
        ThirdPartyInitialize();
    }

    protected void finalize(){
        ThirdPartyTerminate();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Sin*_*hot 16

您通常无法自己"清理"Java对象.垃圾收集器决定何时清理对象.您可以通过设置对象引用来指示何时完成对象引用null,但通常只是让它超出范围就足够了.无论哪种方式,您仍然无法控制何时收集垃圾.

finally块用于执行操作,无论是否从try块中抛出异常,并且是执行清理的最佳位置.通常,您只会清理非开放流等非对象资源.

finalize()不保证被调用,因为在程序退出之前不保证会调用垃圾收集器.它不像C++析构函数,因为C++析构函数总是被调用,你可以依赖它们被调用.你不能依赖finalize()被召唤.

因此1)使用finally块来释放非对象资源2)让垃圾收集器清理对象资源3)你可以通过设置它来向垃圾收集器提示你完成了一个对象,null如果它在长时间使用的话跑步方法.


dav*_*351 5

如果您的程序也关闭,您还可以为程序添加一个关闭钩子:

//add shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        ThirdPartyTerminate();
    }
});
Run Code Online (Sandbox Code Playgroud)