如何用类之间的相互依赖关系替换Java 11项目中不推荐的finalize()方法
我有一个涉及多个类的Java11项目。在当前场景中,我的两个类(A和B)实现了java finalize()方法,该方法现在已经不再推荐使用。我知道在不久的将来可能不会删除该方法,但我认为最好立即找到一个替代方法
类A中的finalize()主要用于销毁作为受保护成员变量的长类型对象,以及将某些消息打印到日志。类B中的finalize()只是将某些消息打印到日志中
类A的实例是从其他几个类创建的,类B扩展了另一个类加载器。(下面包括代码片段。)
我考虑了很多建议,比如
- 可通过资源尝试自动关闭
- 可清除接口(https://humanoid-readable.claude-martin.ch/2014/07/30/finalize/)
- 最后试着接球
这些问题一开始解释得不太好,即使解释得很好,示例也只适用于同一类中存在主方法的单类项目。我无法继续使用我在网上找到的最小解决方案
在我的研究之后,自动关闭并尝试使用资源似乎是我最好的选择。我知道我的类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 楼答案
因此,到目前为止,带有try with resources的自动关闭接口似乎是您的最佳选择。根据我的说法,finalize的这个替代方案是最简单的实现方法——但这当然可能会根据每个项目的复杂性而有所不同
类A必须实现自动关闭
class A implements AutoCloseable
,并且创建它的对象的所有位置都应该包含在一个try-like中try (A obj = new A())
现在,进一步重写AutoCloseable提供的close方法,并从内部调用destroy()