Java 9 个清洁器和 Cleaner.Cleanable 个对象
Java 9 Cleaner & Cleaner.Cleanable objects
我需要为 LWJGL 项目使用本机指针(一个 int),我正在学习的教程建议使用 Object.finalize() 方法。但是,由于它自 Java 9 以来已被弃用,我寻找更好的解决方案。我在 Oracle 文档上找到了 Cleaner/Cleanable duo 并尝试使用它,但我不知道我这样做是否正确。这是要走的路吗?
import java.lang.ref.Cleaner;
public class PointerUsingObject
{
// A native pointer
private int pointer;
private static final Cleaner cleaner = Cleaner.create();
private final Cleaner.Cleanable cleanable;
public PointerUsingObject()
{
cleanable = cleaner.register(this, new Runnable()
{
@Override
public void run()
{
// Free the pointer
}
});
}
// Is called to destroy the object when I'm sure not to use it anymore
public void destroy()
{
cleanable.clean();
}
}
好的,正如有人指出的那样,我应该实例化一个静态嵌套 class 来管理清洁,如下所示:
import java.lang.ref.Cleaner;
public class PointerUsingObject implements AutoCloseable
{
// A native pointer
private int pointer;
private static final Cleaner cleaner = Cleaner.create();
private final Cleaner.Cleanable cleanable;
public PointerUsingObject()
{
cleanable = cleaner.register(this, new CleanMethod(pointer));
}
@Override
public void close() throws Exception
{
cleanable.clean();
}
private static class CleanMethod implements Runnable
{
private int pointer;
public CleanMethod(int pointer)
{
this.pointer = pointer;
}
@Override
public void run()
{
// Free the pointer
}
}
}
我还实现了 AutoCloseable 接口,并将 destroy() 方法替换为 close() 方法。
我需要为 LWJGL 项目使用本机指针(一个 int),我正在学习的教程建议使用 Object.finalize() 方法。但是,由于它自 Java 9 以来已被弃用,我寻找更好的解决方案。我在 Oracle 文档上找到了 Cleaner/Cleanable duo 并尝试使用它,但我不知道我这样做是否正确。这是要走的路吗?
import java.lang.ref.Cleaner;
public class PointerUsingObject
{
// A native pointer
private int pointer;
private static final Cleaner cleaner = Cleaner.create();
private final Cleaner.Cleanable cleanable;
public PointerUsingObject()
{
cleanable = cleaner.register(this, new Runnable()
{
@Override
public void run()
{
// Free the pointer
}
});
}
// Is called to destroy the object when I'm sure not to use it anymore
public void destroy()
{
cleanable.clean();
}
}
好的,正如有人指出的那样,我应该实例化一个静态嵌套 class 来管理清洁,如下所示:
import java.lang.ref.Cleaner;
public class PointerUsingObject implements AutoCloseable
{
// A native pointer
private int pointer;
private static final Cleaner cleaner = Cleaner.create();
private final Cleaner.Cleanable cleanable;
public PointerUsingObject()
{
cleanable = cleaner.register(this, new CleanMethod(pointer));
}
@Override
public void close() throws Exception
{
cleanable.clean();
}
private static class CleanMethod implements Runnable
{
private int pointer;
public CleanMethod(int pointer)
{
this.pointer = pointer;
}
@Override
public void run()
{
// Free the pointer
}
}
}
我还实现了 AutoCloseable 接口,并将 destroy() 方法替换为 close() 方法。