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