在java

时间:2017-12-15 13:21:32

标签: java database caching interface generic-list

我有一个带有数据库和结构的应用程序如下:

  1. 抽象 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());
    }
    
  2. 界面 CacheChangedListener

    public interface CacheChangedListener<T extends DbObject> {
        void onInserted(T object);
        void onUpdated(T object);
        void onDeleted(T object);
        void onCacheCleared();
    }
    
  3. 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);
                    }
            }
        }
    }    
    
  4. 在我的应用程序中,例如,实现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被改变时,我被困在检索正确的监听器..

0 个答案:

没有答案