我有一个带有数据库和结构的应用程序如下:
抽象 DbObject 类,可以在我的数据库中保存/更新/删除。这个DbObject有一个抽象方法" dataChanged",当在数据库中(异步)保存/更新/删除对象时调用它。例如" OrderItem "扩展DbObject的对象:
@Override
public void dataChanged(int changedHow) {
switch (changedHow) {
case DatabaseAccess.OBJECT_INSERT: {
List<OrderItem> list = cache().getOrderItems();
if (!list.contains(this)) {
list.add(this);
}
break;
}
case DatabaseAccess.OBJECT_UPDATE: {
break;
}
case DatabaseAccess.OBJECT_DELETE: {
List<OrderItem> list = cache().getOrderItems();
if (list.contains(this)) {
list.remove(this);
}
break;
}
}
CacheManager.cache().notifyListeners(changedHow, this,CacheManager.cache().getOrderItemListeners());
}
界面 CacheChangedListener :
public interface CacheChangedListener<T extends DbObject> {
void onInserted(T object);
void onUpdated(T object);
void onDeleted(T object);
void onCacheCleared();
}
Singleton CacheManager ,其中包含大量List&lt; DbObject&gt;变量和每个列表中的另一个列表&lt; CacheChangedListener&LT; T>。方法&#34; notifyListeners&#34;从DbObject调用:
public <T extends DbObject> void notifyListeners(int changedHow, T object, List<CacheChangedListener<T>> listeners) {
for (CacheChangedListener<T> l : listeners) {
switch (changedHow) {
case DatabaseAccess.OBJECT_INSERT:
try {
SwingUtilities.invokeLater(() -> l.onInserted(object));
} catch (Exception e) {
LOG.error("Error after insert of " + object.getName(), e);
}
break;
case DatabaseAccess.OBJECT_UPDATE:
try {
SwingUtilities.invokeLater(() -> l.onUpdated(object));
} catch (Exception e) {
LOG.error("Error after update of " + object.getName(), e);
}
break;
case DatabaseAccess.OBJECT_DELETE:
try {
SwingUtilities.invokeLater(() -> l.onDeleted(object));
} catch (Exception e) {
LOG.error("Error after delete of " + object.getName(), e);
}
break;
case DatabaseAccess.OBJECT_CACHE_CLEAR:
try {
SwingUtilities.invokeLater(l::onCacheCleared);
} catch (Exception e) {
LOG.error("Error after clearing cache", e);
}
}
}
}
在我的应用程序中,例如,实现CacheChangedListener&lt;的对话框。 OrderItem&gt;接口,此接口被添加到CacheManager列表List&lt; CacheChangedListener&LT; OrderItem&gt; &GT; onOrderItemsChangedList。保存OrderItem时,&#34; dataChanged&#34;方法将被称为 - &gt;这将调用cache()。notifyListeners(...)方法 - &gt;将通知实现界面的对话框,保存OrderItem。
我的CacheManager包含许多带有DbObject的列表和包含对象接口的列表。对于每个监听器列表,我有添加和删除方法,例如:
public void addOnOrderItemsChangedListener(CacheChangedListener<OrderItem> cacheChangedListener) {
if (!onOrderItemsChangedListenerList.contains(cacheChangedListener)) {
onOrderItemsChangedListenerList.add(cacheChangedListener);
}
}
public void removeOnOrderItemsChangedListener(CacheChangedListener<OrderItem> cacheChangedListener) {
if (onOrderItemsChangedListenerList.contains(cacheChangedListener)) {
onOrderItemsChangedListenerList.remove(cacheChangedListener);
}
}
我的问题是:我能以更通用的方式做到这一点吗?如果我只有一个列表或地图与所有听众,那将是很好的。这样我只需要一个addCacheListener和removeCacheListener方法。
我可以制作一个List&lt; CacheChangedListener&gt;但是当一个特定的DbObject被改变时,我被困在检索正确的监听器..