Atom目前被定义为final,而ARef.validate()是包私有的。这使得定义Atom的子类变得不可能,并且使ARef子类化变得困难(如果需要调用validate())。
我建议移除Atom的final修饰符,使ARef.validate()变为protected,并将Atom.state也变为protected(它现在是包私有)。
我不确定为什么Atom是final的原因是否具体——这可能是因为性能原因或防止有人对Atom做奇怪的事情,但我可以看到对它进行子类化的用例。
一个用例是创建一个允许跟踪deref的响应式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复制到自己的命名空间中。这似乎有些不方便。