2014-10-08 36 views
0

我剛剛開始在使用廣泛的Bean綁定(MVVM模式)的Java項目中使用GlazedLists。如何處理GlazedLists對共享發佈者和鎖定的PluggableList要求

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)我必須做的,因爲在UiController組件的具體要求在模型的決定。這似乎違反了MVVM模式。

(2)共享鎖可能會影響列表的性能,如果列表數量非常多並且經常訪問它們,因爲它們都共享相同的鎖定。否則這些列表中的每一個都應該能夠獨立操作而不必關心對方。

我該怎麼解決這個問題?如果沒有ModelClass必須瞭解特殊的UiControllerClass需求並且沒有潛在的性能影響,是否有更好的方法使PluggableLists可以工作?

回答

0

我想出了一個優雅的解決方案,它保留了MVVM模式,並且不需要共享鎖和發佈者。

我創建了一個自定義列表轉換​​,它擴展了PluggableList並覆蓋了它的setSource方法。然後將新的源列表與由PluggableList創建的新列表同步(它將具有與PluggableList相同的發佈者和鎖定)。

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(); 
     } 
    } 
}