Java 如何应对玻璃主义者';s共享发布服务器和锁的PluggableList要求

Java 如何应对玻璃主义者';s共享发布服务器和锁的PluggableList要求,java,mvvm,glazedlists,pluggable,beans-binding,Java,Mvvm,Glazedlists,Pluggable,Beans Binding,我刚刚开始在一个广泛使用beansbinding(MVVM模式)的Java项目中使用GlazedList PluggableList允许我将源列表绑定到表,然后在运行时更改源列表。为了实现这一点,每个源列表都必须共享相同的ListEventPublisher和ReadWriteLock,因为PluggableList必须与其源共享锁和plublisher。我通过在拥有潜在源列表的类中创建静态发布者和锁来实现这一点,使用这些静态值在类的每个实例化以及PluggableList中创建列表,如下面的伪

我刚刚开始在一个广泛使用beansbinding(MVVM模式)的Java项目中使用GlazedList

PluggableList允许我将源列表绑定到表,然后在运行时更改源列表。为了实现这一点,每个源列表都必须共享相同的ListEventPublisher和ReadWriteLock,因为PluggableList必须与其源共享锁和plublisher。我通过在拥有潜在源列表的类中创建静态发布者和锁来实现这一点,使用这些静态值在类的每个实例化以及PluggableList中创建列表,如下面的伪代码所示:

public class ModelClass
{
    final static EventList          LIST               = new BasicEventList();
    final static ListEventPublisher LISTEVENTPUBLISHER = LIST.getPublisher();
    final static ReadWriteLock      READWRITELOCK      = LIST.getReadWriteLock();

    final EventList                 sourceList         = 
            new BasicEventList(LISTEVENTPUBLISHER, READWRITELOCK);
}


public class UiControllerClass
{
    final PluggableList pluggableList = 
        new PluggableList(ModelClass.LISTEVENTPUBLISHER, ModelClass.READWRITELOCK);

    // ... call pluggableList.setSource(someSourceList) 
}
我对此有两个担忧:

(1) 我必须在模型中做出决定,因为模型中某个组件的特定需求。这似乎违反了MVVM模式

(2) 共享锁可能会影响列表的性能,如果列表非常多并且访问频繁,因为它们都共享同一个锁。否则,这些列表中的每一个都应该能够独立运行,而不必相互关心


我做得不对吗?有没有更好的方法使PluggableList在ModelClass不需要知道特殊的类要求和不影响潜在性能的情况下工作

我提出了一个优雅的解决方案,既保留了MVVM模式,又不需要共享锁和发布服务器

我创建了一个自定义列表转换,它扩展了PluggableList并覆盖了它的setSource方法。然后,新的源列表与PluggableList创建的新列表同步(它将具有与PluggableList相同的发布者和锁)

public类热插拔插件列表
扩展可插拔列表
{
private EventList syncSourceList=新建基本事件列表();
私有ListEventListener ListEventListener=null;
公共热插拔插件列表()
{
super(新的BasicEventList());
}
@凌驾
public void setSource(最终事件列表sourceList)
{
getReadWriteLock().writeLock().lock();
尝试
{
如果(listEventListener!=null)
{
syncSourceList.RemovelListentListener(ListentListener);
}
syncSourceList=源列表;
最终事件列表syncTargetList=createSourceList();
listEventListener=glazedList.syncEventListToList(syncSourceList,syncTargetList);
super.setSource(syncTargetList);
}
最后
{
getReadWriteLock().writeLock().unlock();
}
}
}
public class HotSwappablePluggableList<T>
        extends PluggableList<T>
{
    private EventList<T>         syncSourceList    = new BasicEventList<>();
    private ListEventListener<T> listEventListener = null;

    public HotSwappablePluggableList()
    {
        super(new BasicEventList<T>());
    }

    @Override
    public void setSource(final EventList<T> sourceList)
    {
        getReadWriteLock().writeLock().lock();
        try
        {
            if (listEventListener != null)
            {
                syncSourceList.removeListEventListener(listEventListener);
            }

            syncSourceList = sourceList;

            final EventList<T> syncTargetList = createSourceList();
            listEventListener = GlazedLists.syncEventListToList(syncSourceList, syncTargetList);

            super.setSource(syncTargetList);
        }
        finally
        {
            getReadWriteLock().writeLock().unlock();
        }
    }
}