2014-02-23 37 views
0

假設我有一個Handler通過偵聽器將數據記錄到某個對象。如何在兩個命令處理程序之間進行通信

public Object execute(ExecutionEvent event) throws ExecutionException { 
    IHandlerService service; 
    IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); 
    try { 
     RecordingDocument d = new RecordingDocument("TestProject", "Tester", true); 
     d.record(); 
     MessageDialog.openInformation(
       window.getShell(), 
       "JavaTV", 
       "You are now recording."); 
    } catch (CoreException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

該對象是在選擇某個菜單項並開始記錄到對象內的數據結構時創建的。

如何從不同的處理程序中檢索此文檔?如果有人使用菜單停止錄製,我需要這個。

回答

0

這似乎是一個關於如何使某些對象可被其他對象訪問的普通Java問題。顯然,你需要將它存儲在一個可以被其他人訪問的地方(提供一個getter,放到註冊表,存儲到數據庫,序列化到硬盤等等)。有許多設計模式可以解決您的問題,因此無法提供理想的答案。

你不能,可能使用getters,因爲正如你提到的Handler在執行菜單時創建的那樣。我認爲每次都不會重新創建處理程序,但只能在第一次訪問時重新創建,所以您可以在處理程序中創建實例變量,但這看起來不正確。

存儲到數據庫和序列化在這個階段對你來說可能過於矯枉過正,所以我建議你使用Registry pattern(把它想象成一個全局緩存)把對象放到註冊表中。所以,這裏是你能做什麼:

public class DocumentsRegistry { 
    private Map<String, RecordingDocument> registry = new HashMap<String, RecordingDocument>(); 
    private static DocumentRegistry instace = new DocumentRegistry(); 

    public static DocumentRegistry getInstance() { 
     return instance; 
    } 

    public void registerDocument(String key, RecordingDocument document) { 
     registry.put(key, document); 
    } 

    public RecordingDocument getDocument(String key) { 
     return registry.get(key); 
    } 
} 

// your handler 

public static final String DOCUMENT_KEY = "DOCUMENT"; 

public Object execute(ExecutionEvent event) throws ExecutionException { 
    IHandlerService service; 
    IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); 
    try { 
     RecordingDocument d = new RecordingDocument("TestProject", "Tester", true); 
     d.record(); 
     MessageDialog.openInformation(
       window.getShell(), 
       "JavaTV", 
       "You are now recording."); 
     DocumentsRegistry.getInstance().registerDocument(DOCUMENT_KEY, d); 
    } catch (CoreException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

// another handler 
public Object execute(ExecutionEvent event) throws ExecutionException { 
    RecordingDocument d = DocumentsRegistry.getInstance().getDocument(DOCUMENT_KEY); 
    // do something with it 
    return null; 
} 

如果你想支持併發的錄音,讓很多文檔可以在同一時間打開,你將需要爲每個生成的密鑰文件的解決方案。

相關問題