如何在两个命令处理程序之间进行通信

时间:2014-02-23 01:36:56

标签: java eclipse eclipse-plugin eclipse-rcp

假设我有一个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;
}

当选择其中一个菜单项并开始记录到对象内的数据结构时,将创建此对象。

如何从其他处理程序检索此文档?如果有人使用菜单停止录制,我需要这个。

1 个答案:

答案 0 :(得分:0)

这似乎是关于如何使某些对象可被其他对象访问的一般Java问题。显然,您需要将其存储在一个可供其他人访问的位置(提供getter,放入注册表,存储到DB,序列化到硬盘等)。有许多设计模式可以解决您的问题,因此无法提供理想的答案。

你不能,可能使用getter,因为你提到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;
}

如果您想支持并发录制,以便可以同时打开许多文档,则需要一个解决方案来为每个文档生成密钥。