正如@TomasMikula在@eckig(现已删除)的答案中所说,对的需求可能不足
ObservableQueue。如果您有可靠的用例,则应考虑提交功能请求。
同时,通过子类化和包装实现来创建快速,肮脏的
ObservableQueue实现
Queue并添加“可观察性”
并不难。子类化是“快速”部分,也是“脏”部分,因为您同时公开方法和方法。因为任意方法没有唯一的实现方法(我可以看到)是迭代直到。任何用于迭代的操作(将其视为)都会及时运行。有了这一警告,以下内容应该可以很好地工作:
ObservableListbase``Queue``ObservableListbase``List``Queue``Queue``get(intindex)``index``get``ObservableQueue``List``O(n^2)
import java.util.linkedList;import java.util.Queue;import javafx.collections.ObservableListbase;public class ObservableQueue<E> extends ObservableListbase<E> implements Queue<E> { private final Queue<E> queue ; public ObservableQueue(Queue<E> queue) { this.queue = queue ; } public ObservableQueue() { this(new linkedList<>()); } @Override public boolean offer(E e) { beginChange(); boolean result = queue.offer(e); if (result) { nextAdd(queue.size()-1, queue.size()); } endChange(); return result ; } @Override public boolean add(E e) { beginChange() ; try { queue.add(e); nextAdd(queue.size()-1, queue.size()); return true ; } finally { endChange(); } } @Override public E remove() { beginChange(); try { E e = queue.remove(); nextRemove(0, e); return e; } finally { endChange(); } } @Override public E poll() { beginChange(); E e = queue.poll(); if (e != null) { nextRemove(0, e); } endChange(); return e ; } @Override public E element() { return queue.element(); } @Override public E peek() { return queue.peek(); } @Override public E get(int index) { Iterator<E> iterator = queue.iterator(); for (int i = 0; i < index; i++) iterator.next(); return iterator.next(); } @Override public int size() { return queue.size(); }}您可以
ListChangeListener向此注册,以通知队列修改。(请注意,如果您要支持提取程序和更新通知,则需要做更多的工作…)。
import javafx.collections.ListChangeListener.Change;public class ObservableQueueTest { public static void main(String[] args) { ObservableQueue<String> oq = new ObservableQueue<>(); oq.addListener((Change<? extends String> change) -> { while (change.next()) { if (change.wasAdded()) { System.out.println("Added: "+change.getAddedSubList()); } if (change.wasRemoved()) { System.out.println("Removed: "+change.getRemoved()); } if (change.wasUpdated()) { System.out.println("Updated: "+oq.subList(change.getFrom(), change.getTo())); } if (change.wasReplaced()) { System.out.println("Replaced"); } } }); oq.offer("One"); oq.offer("Two"); oq.offer("Three"); System.out.println("Peek: "+oq.peek()); System.out.println("Remove..."); System.out.println(oq.remove()); System.out.println("Element:"); System.out.println(oq.element()); System.out.println("get(1): "+oq.get(1)); System.out.println("Poll: "); System.out.println(oq.poll()); System.out.println("Poll again:"); System.out.println(oq.poll()); System.out.println("Poll should return null:"); System.out.println(oq.poll()); System.out.println("Element should throw exception:"); System.out.println(oq.element()); }}


