Atom目前被定义为最终值,而ARef.validate()是包私有的。这使得无法定义Atom的子类,如果在调用validate()时有困难。
我建议将Atom的final修饰符移除,使ARef.validate()成为受保护的,并将Atom.state也改为受保护的(目前是包私有的)。
我不确定为什么Atom是final - 这可能是为了性能原因或防止有人对Atom进行奇怪的操作,但我可以看到子类化的一个用例。
一个用例是创建一个反应式Atom,允许跟踪解引用(如在reagent中)。我在Clojure(不是Clojurescript)代码中尝试了这个想法,并因为它是密封的,不得不复制整个Atom类(并将其放置在clojure.lang包中),因为ARef.validate()是包私有的:https://github.com/aaronc/freactive/blob/master/src/java/clojure/lang/ReactiveAtom.java。此外,我还需要将swap!和reset!的定义复制到我的命名空间中。这看起来有点不方便。