好的,有一个 C 方法调用了一个释放内存区域的指针。我不希望我的 java 绑定用户显式调用此方法,因为在 java 中它没有意义,这基本上是一种数据结构。
所以,我只是做了一个 finalize() 覆盖,把 c 调用放在那里。无论如何,人们说依靠finalize不好......你有更好的主意吗?
好的,有一个 C 方法调用了一个释放内存区域的指针。我不希望我的 java 绑定用户显式调用此方法,因为在 java 中它没有意义,这基本上是一种数据结构。
所以,我只是做了一个 finalize() 覆盖,把 c 调用放在那里。无论如何,人们说依靠finalize不好......你有更好的主意吗?
使用该finalize
方法有一些问题:您无法保证何时或是否会调用它,它会迫使垃圾收集器做额外的工作,很容易出错。
释放资源的需求非常普遍,无论它们是打开的文件描述符、窗口句柄、数据库结果集还是其他东西。在这些情况下,类有明确的close
和dispose
方法,用户必须调用它们。我建议您按照这些类设置的示例并添加一个close
方法。如果您实现AutoCloseable
接口,API 用户甚至可以使用 try-with-resources 语句,而不必close()
显式调用。
有时可能的替代方法是创建直接 ByteBuffer 并将其传递给 C 库,而不是 C 库自己分配内存。当 ByteBuffer 对象被垃圾回收时,堆外缓冲区就会被释放。java.lang.ref
顺便说一句,这是使用package中的幻像引用来实现的。