2014-10-08 5 views
0

beanbinding (MVVM 패턴)을 광범위하게 사용하는 Java 프로젝트에서 GlazedLists를 사용하기 시작했습니다.공유 게시자 및 잠금에 대한 GlazedLists의 PluggableList 요구 사항 처리 방법

PluggableList를 사용하면 소스 목록을 표에 바인딩 한 다음 런타임에 소스 목록을 변경할 수 있습니다. 이 작업을 수행하려면 PluggableList가 소스와 잠금 및 플러 블러를 공유해야하므로 모든 소스 목록이 동일한 ListEventPublisher 및 ReadWriteLock을 공유해야합니다. 나는 잠재적 인 소스 목록을 소유하고있는 클래스에서 정적 게시자를 만들고이를 잠그고, 아래의 의사 코드와 같이 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(); 
     } 
    } 
}