如何用类之间的相互依赖关系替换Java 11项目中不推荐的finalize()方法
我有一个涉及多个类的Java11项目。在当前场景中,我的两个类(A和B)实现了java finalize()方法,该方法现在已经不再推荐使用。我知道在不久的将来可能不会删除该方法,但我认为最好立即找到一个替代方法 类A中的finalize()主要用于销毁作为受保护成员变量的长类型对象,以及将某些消息打印到日志。类B中的finalize()只是将某些消息打印到日志中 类A的实例是从其他几个类创建的,类B扩展了另一个类加载器。(下面包括代码片段。) 我考虑了很多建议,比如如何用类之间的相互依赖关系替换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扩展了另一个类加载器。(下面包括代码片段。) 我考虑了很多建议,比如 可通过资源尝试自动关闭
- 可通过资源尝试自动关闭
- 可清洗接口()
- 最后试着接球
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 classC
,根据我的评论,在原始问题中。但是由于java.lang.ClassLoader
没有实现finalize()
,您根本不必担心删除B.finalize()
,正如我已经说过的。java.lang.ref.Cleaner
(或其底层技术PhantomReference
)是替代finalize()的另一种方法
而且可能是最直接的替代品。