Có cách nào tốt hơn để có một người nghe trên một bộ sưu tập java hơn là bọc nó trong một lớp thực hiện mô hình quan sát?Cách hay để có Người nghe Bộ sưu tập?
Trả lời
Bạn nên kiểm tra Glazed Lists
Nó chứa các lớp Danh sách thể quan sát được, mà sự kiện cháy bất cứ khi nào các yếu tố được thêm vào, gỡ bỏ, thay thế, vv
Vâng, nếu bạn không thực sự cần một phiên bản java.util.Collection hoặc Danh sách, bạn có thể sử dụng một DefaultListModel. Tôi không biết về bất kỳ triển khai Bộ sưu tập "thực" nào có hỗ trợ người nghe/người quan sát tích hợp.
Bạn liên kết phiên bản Java 6 của DefaultListModel, không sử dụng Generics. [Phiên bản Java 7] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) có thể làm cho đề xuất của bạn hấp dẫn hơn. –
@MartinRust tốt, vâng, câu trả lời là từ 2 năm trước khi Java 7 ra mắt. Nếu tôi cập nhật nó, tôi cũng có thể sử dụng Java 8 bây giờ –
"Commons-Events cung cấp các lớp bổ sung để kích hoạt và xử lý sự kiện. Nó tập trung vào Khung công tác Java, cung cấp trang trí cho các bộ sưu tập khác kích hoạt sự kiện".
Cần lưu ý rằng đây vẫn là một dự án sandbox. Một điều thú vị tuy nhiên. – BalusC
Bạn có thể sử dụng ForwardingSet, ForwardingList, vv, từ Guava để trang trí một trường hợp cụ thể với hành vi mong muốn.
Dưới đây là thực hiện của riêng tôi mà chỉ sử dụng API JDK đồng bằng:
// create an abstract class that implements this interface with blank implementations
// that way, annonymous subclasses can observe only the events they care about
public interface CollectionObserver<E> {
public void beforeAdd(E o);
public void afterAdd(E o);
// other events to be observed ...
}
// this method would go in a utility class
public static <E> Collection<E> observedCollection(
final Collection<E> collection, final CollectionObserver<E> observer) {
return new Collection<E>() {
public boolean add(final E o) {
observer.beforeAdd(o);
boolean result = collection.add(o);
observer.afterAdd(o);
return result;
}
// ... generate rest of delegate methods in Eclipse
};
}
có rất nhiều cách để đạt được điều này - thường tôi sử dụng phương pháp này
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ObservableArrayList<E> extends ArrayList<E> {
private @interface MethodId {
private static final int REMOVE = 2;
private static final int ADD = 1;
}
public interface ListObserver<E> {
void onElementAdded(E element);
void onElementRemoved(E element);
}
public ObservableArrayList(int capacity) {
super(capacity);
ensureObserver();
}
public ObservableArrayList() {
ensureObserver();
}
public ObservableArrayList(Collection<? extends E> collection) {
super(collection);
ensureObserver();
}
private List<WeakReference<ListObserver<E>>> _listObserverWeakRefList;
public void addObserver(ListObserver<E> observer) {
_listObserverWeakRefList.add(new WeakReference<ListObserver<E>> (observer));
}
private void ensureObserver() {
if (_listObserverWeakRefList == null) {
_listObserverWeakRefList = new ArrayList<>();
}
}
@Override
public boolean add(E object) {
super.add(object);
callObservable(MethodId.ADD, object);
return true;
}
@Override
public boolean remove(Object object) {
boolean removed = super.remove(object);
if (removed) callObservable(MethodId.REMOVE, object);
return removed;
}
private void callObservable(@MethodId int methodId, Object element) {
for (WeakReference<ListObserver<E>> observerRef : _listObserverWeakRefList) {
ListObserver<E> observer = observerRef.get();
if (observer != null) {
switch (methodId) {
case MethodId.ADD:
observer.onElementAdded((E) element);
break;
case MethodId.REMOVE:
observer.onElementRemoved((E) element);
break;
}
}
}
}
}
- 1. Bắn người nghe JPA về thay đổi trường sưu tập
- 2. Khi nào sử dụng EventListenerList thay vì một bộ sưu tập chung của người nghe
- 3. Bộ sưu tập tuyển tập có mảng
- 4. Bộ sưu tập để Iterable
- 5. Backbone.js Bộ sưu tập của Bộ sưu tập
- 6. Bộ sưu tập MongoDB có thể có bên trong bộ sưu tập khác không?
- 7. Hibernate: Tiêu chí có bộ sưu tập
- 8. Nhiều nhà văn, một người đọc, bộ sưu tập
- 9. Bộ sưu tập Backbone.js có nhiều loại
- 10. Bộ sưu tập rác
- 11. Chung Bộ sưu tập
- 12. WinRT có bộ sưu tập rác không?
- 13. Backbone.js: cách lọc đúng bộ sưu tập?
- 14. Tải bộ sưu tập NHibernate, "truy cập bất hợp pháp để tải bộ sưu tập"
- 15. Sắp xếp bộ sưu tập trong bộ sưu tập bằng cách sử dụng LINQ
- 16. Cách xóa bộ sưu tập có tên 'nhóm'?
- 17. Làm cách nào để thêm các phần tử từ một bộ sưu tập không tồn tại trong bộ sưu tập thứ hai vào bộ sưu tập thứ ba?
- 18. Cách hợp nhất một bộ sưu tập các bộ sưu tập trong LINQ
- 19. Truy vấn đệ quy trong SPARQL để duyệt bộ sưu tập các bộ sưu tập
- 20. Bộ sưu tập chung được sưu tầm
- 21. Lọc bộ sưu tập để Magento
- 22. Hibernate - Cách duy trì một mục mới trong Bộ sưu tập mà không tải toàn bộ Bộ sưu tập
- 23. Bộ sưu tập kiểu tạo bởi để có năng suất
- 24. Trở bộ sưu tập trống
- 25. Cách sử dụng bộ sưu tập rác để xóa tệp?
- 26. Bộ sưu tập được đồng bộ hóa
- 27. Làm cách nào để đảo ngược bộ sưu tập Groovy?
- 28. Làm thế nào để tạo một phần cấu hình có chứa một bộ sưu tập các bộ sưu tập?
- 29. C# Đặt bộ sưu tập?
- 30. bộ sưu tập với lambdaj
Đồng ý. GlazedLists là tuyệt vời. – Barend
Thật vậy, một hoặc hai người cùng làm việc trên cả hai ... –
Danh sách chuyển đổi 'Danh sách bằng kính mong đợi vứt bỏ() được gọi bằng tay thay vì sử dụng WeakReferences cho người nghe ....? 0.o Phải có cái gì đó tốt hơn ngoài kia. – user515655