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() 方法。