如何用 类 之间的相互依赖替换 Java 11 项目中已弃用的 finalize() 方法
How to replace the deprecated finalize() method from a Java 11 project with inter - dependencies among classes
我有一个涉及多个 classes 的 Java 11 项目。在当前情况下,我的 classes 中的 2 个 - A 和 B - 实现了 java finalize() 方法,该方法现在已被永久弃用。我知道该方法在不久的将来可能不会被删除,但我认为最好立即找到 finalize 的替代方法。
finalize() in class A 主要专注于销毁作为受保护成员变量的 long 类型对象以及打印某些消息以进行记录。 class B 中的 finalize() 只是将某些消息打印到日志中。
class A 的实例是从其他几个 classes 创建的,class B 扩展了另一个 class ClassLoader。 (下面包含代码片段。)
我考虑了很多建议,例如,
- 可使用 try-with-resources 自动关闭
- 可清理界面(https://humanoid-readable.claude-martin.ch/2014/07/30/finalize/)
- 最终尝试捕获
这些一开始就没有很好地解释,即使解释得很好,这些示例也是针对单个 class 项目的,其主要方法出现在同一个 class 中。我无法继续使用我在网上找到的最小解决方案。
Post 根据我的研究,Autocloseable with try-with-resources 似乎是我的最佳选择。我知道我的 classes A 和 B 应该实现 Autocloseable 而被调用者(这里有点不确定)应该使用 try-with-resources。
对于简化此问题的任何帮助,我将不胜感激,即使它是为了填补我对该场景的理解中可能存在的空白。
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 的 AutoCloseable 界面似乎是您的最佳选择。根据我的说法,这个 finalize 的替代方案是最容易实现的——但这当然可能因每个项目的复杂性而异。
class 必须实现 AutoCloseable class A implements AutoCloseable
并且创建它的对象的所有地方都应该包含在 try 中
try (A obj = new A())
现在更进一步,覆盖 AutoCloseable 提供的关闭方法,并从内部调用 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.
}
我有一个涉及多个 classes 的 Java 11 项目。在当前情况下,我的 classes 中的 2 个 - A 和 B - 实现了 java finalize() 方法,该方法现在已被永久弃用。我知道该方法在不久的将来可能不会被删除,但我认为最好立即找到 finalize 的替代方法。
finalize() in class A 主要专注于销毁作为受保护成员变量的 long 类型对象以及打印某些消息以进行记录。 class B 中的 finalize() 只是将某些消息打印到日志中。
class A 的实例是从其他几个 classes 创建的,class B 扩展了另一个 class ClassLoader。 (下面包含代码片段。)
我考虑了很多建议,例如,
- 可使用 try-with-resources 自动关闭
- 可清理界面(https://humanoid-readable.claude-martin.ch/2014/07/30/finalize/)
- 最终尝试捕获
这些一开始就没有很好地解释,即使解释得很好,这些示例也是针对单个 class 项目的,其主要方法出现在同一个 class 中。我无法继续使用我在网上找到的最小解决方案。
Post 根据我的研究,Autocloseable with try-with-resources 似乎是我的最佳选择。我知道我的 classes A 和 B 应该实现 Autocloseable 而被调用者(这里有点不确定)应该使用 try-with-resources。
对于简化此问题的任何帮助,我将不胜感激,即使它是为了填补我对该场景的理解中可能存在的空白。
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 的 AutoCloseable 界面似乎是您的最佳选择。根据我的说法,这个 finalize 的替代方案是最容易实现的——但这当然可能因每个项目的复杂性而异。
class 必须实现 AutoCloseable class A implements AutoCloseable
并且创建它的对象的所有地方都应该包含在 try 中
try (A obj = new A())
现在更进一步,覆盖 AutoCloseable 提供的关闭方法,并从内部调用 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.
}