为了账号安全,请及时绑定邮箱和手机立即绑定

如何用类之间的相互依赖关系替换 Java 11 项目中已弃用的 Finalize() 方法

如何用类之间的相互依赖关系替换 Java 11 项目中已弃用的 Finalize() 方法

不负相思意 2023-08-04 17:39:38
我有一个涉及多个类的 Java 11 项目。在当前场景中,我的 2 个类(A 和 B)实现了 java Finalize() 方法,该方法现已永久弃用。我知道该方法可能不会在不久的将来被删除,但我认为最好立即找到 Finalize 的替代方法。A类中的finalize()主要关注于销毁一个受保护的成员变量long类型的对象,并将某些消息打印到日志中。B 类中的 Finalize() 只是将某些消息打印到日志中。类 A 的实例是从其他几个类创建的,类 B 扩展了另一个类 ClassLoader。(下面包含代码片段。)我经历了很多建议,例如,可通过 try-with-resources 自动关闭可清理的界面尝试-捕获-最终这些一开始就没有得到很好的解释,即使解释得很好,这些示例也特定于单类项目,并且主方法存在于同一类中。我无法继续使用我在网上找到的最小解决方案。经过我的研究,带有 try-with-resources 的 Autocloseable 似乎是我的最佳选择。我知道我的类 A 和 B 应该实现 Autocloseable,而被调用者(这里有点不确定)应该使用 try-with-resources。我将不胜感激任何有助于简化这个问题的帮助,即使它是为了填补我对这个场景的理解中可能存在的空白。A.javaclass A{    protected long a_var;    protected A(String stmt, boolean isd)    {        // a_var is initialized here    }    public void finalize()    {        if(a_var != 0)        {            log("CALL destroy !");            destroy(a_var);            log("DONE destroy !");        }    }}B.javapublic class B extends extends ClassLoader{    protected void finalize ()    {        log("No action");    }}
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

因此,带有 try-with-resources 的 AutoCloseable 接口似乎是迄今为止最好的选择。根据我的说法,finalize 的这种替代方案是最容易实现的 - 但这当然可能会根据每个项目的复杂性而有所不同。


类 A 必须实现 AutoCloseable class A implements AutoCloseable,并且创建其对象的所有位置都应包含在 try 中,例如 try (A obj = new A())


现在更进一步,重写 AutoCloseable 提供的 close 方法,并从内部调用 destroy() 。


class A implements AutoCloseable

{

    @Override

    public void close()

    {

        //log messages

        destroy();

    }

}


class X

{

    // suppose creating object of A within some method

    // enclose in try

    try ( A obj = new A ())

    {

        //use obj

    }

    // at the end of scope, the close() method of A will be called.

}


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信