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