Atom 当前被定义为最终类且 ARef.validate() 为包私有。这使得定义 Atom 的子类和使得 ARef 容易子类化变得不可能(如果需要调用 validate())。
我建议移除 Atom 的最终修饰符,将 ARef.validate() 设置为受保护的,同时将 Atom.state 也设置为受保护的(它目前是包私有)。
我不确定 Atom 被定义为最终类是否有特定的原因——这是否是为性能原因或防止有人用 Atom 做出奇怪的事情,但我可以想象出对其子类化的使用案例。
一个用例是创建允许跟踪 derefs 的响应式 Atom(如 reagent)。我有一些 Clojure(非 Clojurescript)代码,我在尝试玩这个想法,并不得不复制整个 Atom 类(因为它被封闭)并将其放置在 clojure.lang 包中(因为 ARef.validate() 是包私有的):https://github.com/aaronc/freactive/blob/master/src/java/clojure/lang/ReactiveAtom.java。此外,我还需要复制 swap! 和 reset! 的 defns 到我自己的命名空间。这看起来有点不方便。