有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何用类之间的相互依赖关系替换Java 11项目中不推荐的finalize()方法

我有一个涉及多个类的Java11项目。在当前场景中,我的两个类(A和B)实现了java finalize()方法,该方法现在已经不再推荐使用。我知道在不久的将来可能不会删除该方法,但我认为最好立即找到一个替代方法

类A中的finalize()主要用于销毁作为受保护成员变量的长类型对象,以及将某些消息打印到日志。类B中的finalize()只是将某些消息打印到日志中

类A的实例是从其他几个类创建的,类B扩展了另一个类加载器。(下面包括代码片段。)

我考虑了很多建议,比如

这些问题一开始解释得不太好,即使解释得很好,示例也只适用于同一类中存在主方法的单类项目。我无法继续使用我在网上找到的最小解决方案

在我的研究之后,自动关闭并尝试使用资源似乎是我最好的选择。我知道我的类A和B应该实现自动关闭,而被调用方(这里有点不确定)应该使用try with资源

如果有人能帮助我简化这个问题,我将不胜感激,即使这是为了填补我对该情景的理解中可能存在的空白

A.java

class 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.java

public class B extends extends ClassLoader
{
    protected void finalize ()
    {
        log("No action");
    }
}

共 (1) 个答案

  1. # 1 楼答案

    因此,到目前为止,带有try with resources的自动关闭接口似乎是您的最佳选择。根据我的说法,finalize的这个替代方案是最简单的实现方法——但这当然可能会根据每个项目的复杂性而有所不同

    类A必须实现自动关闭class A implements AutoCloseable,并且创建它的对象的所有位置都应该包含在一个try-like中 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.
    }