我正在编写一个小的OpenGL图形"引擎"。正如我到目前为止所了解到的,应该避免在Java中使用finalize
,因为它会减慢GC的速度。
我正在自己发布 OpenGL 资源,通过在名为 OpenGL
的类中注册所有资源(Texture
、Shader
(所有实现Destroyable
))。此类具有公共静态方法render
、init
和destroy
。因此,如果有人使用此引擎,他必须调用destroy
方法OpenGL
。
如果任何愚蠢的程序员忘记调用OpenGL.destroy()
,使用 finalize()
方法来销毁对象是否是一个合适的用例?
这将是我finalize()
的方法:
@Override
protected void finalize() {
if(!isDestroyed())
try {
destroy();
} catch (DestroyFailedException e) {}
}
在这种情况下,使用 finalize()
方法向用户抛出异常以引起人们对不破坏对象的错误的注意似乎是一个很好的解决方案。
销毁finalize()
中的对象不是一个好主意,即使它是有条件的。
除了对finalize()
的一般关注之外,问题在于您只能调用从具有当前OpenGL上下文的线程中销毁OpenGL对象,该线程必须是您的渲染线程,或者在同一共享组中具有OpenGL上下文的另一个线程。据我所知,GC 通常会在自己的线程中运行,因此您不能指望在 finalize()
方法中拥有当前的 OpenGL 上下文。
向finalize()
方法添加诊断以检测程序员何时错过调用destroy()
方法,正如@FlushFish的答案中所建议的那样,听起来是个好主意。但这大约是你应该做的。