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



我有一个涉及多个类的Java 11项目。在当前场景中,我的两个类 - A 和 B - 实现了 java finalize(( 方法,该方法现已被弃用。我知道该方法可能不会在不久的将来被删除,但我认为最好立即找到替代品来完成。

类 A 中的 finalize(( 主要专注于销毁作为受保护成员变量的长类型的对象,并将某些消息打印到日志上。

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

我经历了很多建议,例如,

  • 可使用资源试用自动关闭
  • 可清洁接口 ( https://humanoid-readable.claude-martin.ch/2014/07/30/finalize/(
  • 尝试-接-最后

这些首先解释得不是很好,即使解释得那么好,这些示例也是特定于同一类中存在 main 方法的单类项目。我无法继续使用我在网上找到的最小解决方案。

发布我的研究,使用试用资源自动关闭似乎是我的最佳选择。我知道我的类 A 和 B 应该实现自动关闭,而被调用者(这里有点不确定(应该使用试用资源。

我将不胜感激任何帮助简化这个问题,即使它是为了填补我对场景的理解中可能存在的空白。

答.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");
}
}

因此,具有试用资源的自动关闭界面似乎是迄今为止您的最佳选择。据我说,这种最终确定的替代方案是最容易实现的 - 但这当然可能会根据每个项目的复杂性而有所不同。

类 A 必须实现 AutoCloseableclass A implements AutoCloseable并且创建其对象的所有位置都应包含在类似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.
}

最新更新