似乎无法使用代理重写 Object.finalize()。如果该方法使用代理定义,则无法直接调用(见下文),并且它不会在正常程序执行期间作为终结器被调用(以下未展示)。
有关更详细的讨论,请参阅:https://groups.google.com/group/clojure/browse_thread/thread/a1e2fca45af6c1af
{quote}
user=> (def m (proxy (link: java.util.HashMap) (link: )
(finalize (link: )
;(proxy-super finalize)
(prn "finalizing..."))
(hashCode (link: )
99)))
'user/m
user=> (.hashCode m)
99
user=> (.finalize m)
IllegalArgumentException No matching field found: finalize for class user.proxy$java.util.HashMap$0 clojure.lang.Reflector.getInstanceField (Reflector.java:289)
{quote}
这里至少有两个错误(感谢 Cedric Greevey 以这种方式总结)
- 如果无法重写 finalize() 是无意为之,那么这是错误。
- 如果出于某种原因故意这样做,那么 (a) 这没有进行文档化,并且 (b) 失败是静默的,在调用方法时产生了明显完全无关的错误(如上所示),并且完全静默地失败了调用该方法进行对象最终化的过程。