如何在Clojure中使Java类不可变?

时间:2009-03-22 22:29:00

标签: java lisp clojure immutability priority-queue

我想在clojure中包装java的PriorityQueue类,以便在我的程序的另一部分中使用。我想弄清楚的是,是否有任何方法以lispy方式执行此操作并使优先级队列不可变。有没有什么好方法可以做到这一点,或者我最好将PriorityQueue用作可变数据结构?

2 个答案:

答案 0 :(得分:8)

我认为没有一种简单的方法可以将可变数据结构包装为不可变数据结构。当新版本能够以巧妙的方式与旧版本共享数据时,不可变数据结构变得高效,如果不访问PriorityQueue的内部,我无法真正看到如何做到这一点。

如果你真的想要一个持久的优先级队列this thread可能会很有趣。那些似乎有线性时间插入,所以如果这是一个问题,你可能需要寻找另一个实现。

编辑:第二个想法,持久优先级队列的简单实现只是将(prio,value) - 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)))

当然,上面的代码非常有限(例如,没有多个条目),但它说明了这个想法。

答案 1 :(得分:7)

您不能自动使可变类不可变。总是可以直接调用java类并改变它。

为了强制不变性,你可以在clojure中实现它,或者扩展java类并在所有可变方法实现中抛出异常。