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

欢迎!请查看关于页面以获取更多关于这是如何工作的信息。

+1
Java 互操作性

似乎无法使用代理重写 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) 失败是静默的,在调用方法时产生了明显完全无关的错误(如上所示),并且完全静默地失败了调用该方法进行对象最终化的过程。

1 答案

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