如何使一个Java类Clojure中的不可变的?
-
21-08-2019 - |
题
我想换Java的PriorityQueue的类Clojure中使用我的程序的其他部分。如果有什么办法做到这一点的lispy方式,使优先级队列一成不变我试图找出是。有没有什么好的方法可以做到这一点,还是我只是要更好使用时Queue作为一个可变的数据结构?
解决方案
我不认为有包一个可变的数据结构作为不可变的一个简单方式。不可变的数据结构变得有效时,新版本可以与旧版本的聪明的方式共享数据,我实在看不出如何能不访问PriorityQueue
的内部来完成。
如果你真的想要一个持续的优先级队列这个线程可能很有趣。那些似乎有线性时间插入的,所以如果这是一个问题,也许你必须寻找另一种实现方式。
编辑:关于第二个想法,一个简单的实现持久优先级队列的只是向(PRIO,值)-pairs存储在一个有序集合。是这样的:
(defn make-pqueue []
(sorted-set))
(defn pqueue-add [pq x prio]
(conj pq [prio x]))
(defn pqueue-peek [pq]
(first pq))
(defn pqueue-pop [pq]
(let [top (first pq)]
(disj pq top)))
当然,上面的代码是相当有限的(没有多个条目,例如),但它示出了这个想法。
其他提示
您不能自动地使可变类一成不变的。人们总是可以直接调用java类和变异它。
要强制不变性你可以实现它在Clojure中,或扩展Java类,并在所有的可变方法实现抛出异常。
不隶属于 StackOverflow