Как сделать класс Java неизменным в Clojure? - PullRequest
7 голосов
/ 23 марта 2009

Я бы хотел обернуть java-класс PriorityQueue в clojure для использования в другой части моей программы. То, что я пытаюсь выяснить, - есть ли способ сделать это шустрым способом и сделать очередь приоритетов неизменной. Есть ли какие-либо хорошие способы сделать это, или я просто буду лучше использовать PriorityQueue в качестве изменяемой структуры данных?

Ответы [ 2 ]

8 голосов
/ 23 марта 2009

Я не думаю, что есть простой способ обернуть изменяемую структуру данных как неизменную. Неизменяемые структуры данных становятся эффективными, когда новая версия может совместно использовать данные со старой версией, и я не могу понять, как это можно сделать без доступа к внутренним компонентам PriorityQueue.

Если вам действительно нужна постоянная очередь приоритетов , этот поток может быть интересен. В них, похоже, есть линейные вставки, поэтому, если это проблема, возможно, вам придется искать другую реализацию.

Редактировать: Если подумать, простая реализация очереди с постоянным приоритетом - просто сохранить пары (prio, value) в отсортированном наборе. Примерно так:

(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)))

Конечно, приведенный выше код довольно ограничен (например, без нескольких записей), но он иллюстрирует идею.

7 голосов
/ 23 марта 2009

Вы не можете автоматически сделать изменяемый класс неизменным. Всегда можно вызвать java-класс напрямую и изменить его.

Для принудительной неизменности вы можете либо реализовать ее в clojure, либо расширить класс Java и генерировать исключения во всех реализациях изменяемых методов.

...