2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多此平台的工作方式。

+1
Java 接口

似乎无法使用代理覆盖Object.finalize()。如果使用代理定义了该方法,则无法直接调用(见下文),并且在正常程序执行期间不会被调用作为终结器(以下未演示)。

更多信息请参见: https://groups.google.com/group/clojure/browse_thread/thread/a1e2fca45af6c1af

{引用}
user=> (def m (proxy [java.util.HashMap] ()

    (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)
{引用}

这里至少有两个问题(感谢 Cedric Greevey 的总结)

  • 如果无法覆盖 finalize() 是无意中发生的,那是错误。
  • 如果这是出于某种原因有意为之,那么(a)没有文档说明,并且(b)错误是静默的,因为在显式调用时会产生一个看似完全不相关的错误(上面),并且在整个对象最终化期间不会调用该方法。

1 个答案

0
参考资料: https://clojure.atlassian.net/browse/CLJ-911(由 alex+import 报告)
...