Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用类之间的相互依赖关系替换Java 11项目中不推荐的finalize()方法_Java_Deprecated_Try With Resources_Finalize_Autocloseable - Fatal编程技术网

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

如何用类之间的相互依赖关系替换Java 11项目中不推荐的finalize()方法,java,deprecated,try-with-resources,finalize,autocloseable,Java,Deprecated,Try With Resources,Finalize,Autocloseable,我有一个涉及多个类的Java11项目。在当前场景中,我的两个类(A和B)实现了java finalize()方法,该方法现在已经不再推荐使用。我知道在不久的将来可能不会删除该方法,但我认为最好立即找到一个替代方法 类A中的finalize()主要用于销毁作为受保护成员变量的长类型对象,以及将某些消息打印到日志。类B中的finalize()只是将某些消息打印到日志中 类A的实例是从其他几个类创建的,类B扩展了另一个类加载器。(下面包括代码片段。) 我考虑了很多建议,比如 可通过资源尝试自动关闭

我有一个涉及多个类的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");
    }
}

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

类A必须实现可自动关闭
类A实现可自动关闭
,并且创建它的对象的所有位置都应该包含在一个try-like中
try(A obj=newa())

现在,进一步重写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.
}

嗯,
B.finalize()
除了日志本身之外,已经什么都不做了,您几乎不会错过无关的日志消息:而且它已经无效,因为它应该在其(缺少的)
finally
块中调用
super.finalize()
;所以你可以100%平静地移除它。但是,如果存在
C.finalize()
,现在将为
B
的实例调用它,这可能会很有趣
A.finalize()
调用
A.destroy()
,但您尚未提供,因此无法进一步评论。一个弱引用(或可能是软引用)浮现在脑海中。如果对象位于对象/关系映射中,则可以在(JPA)容器中完成。谢谢,user207421。请注意,类B扩展了类加载器。我已经按照上面查询描述中的要求进行了编辑。假设我需要保留finalize方法当前的所有功能,我将如何采取下一步?
B
extended class
C
,根据我的评论,在原始问题中。但是由于
java.lang.ClassLoader
没有实现
finalize()
,您根本不必担心删除
B.finalize()
,正如我已经说过的。
java.lang.ref.Cleaner
(或其底层技术
PhantomReference
)是替代
finalize()的另一种方法
而且可能是最直接的替代品。