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

Java 如何在两个命令处理程序之间通信,java,eclipse,eclipse-plugin,eclipse-rcp,Java,Eclipse,Eclipse Plugin,Eclipse Rcp,假设我有一个处理程序,它通过侦听器将数据记录到某个对象 public Object execute(ExecutionEvent event) throws ExecutionException { IHandlerService service; IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); try { RecordingDocument d =

假设我有一个处理程序,它通过侦听器将数据记录到某个对象

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;
}
选择其中一个菜单项并开始记录到对象内部的数据结构时,将创建此对象


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

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

您可能不能使用getter,因为正如您所提到的,处理程序是在执行菜单时创建的。我认为处理程序不是每次都重新创建的,只是在第一次访问时,所以可以在处理程序中创建一个实例变量,但这似乎不正确

在这个阶段,将对象存储到DB和序列化对于您来说可能太过分了,所以我建议您使用(将其视为全局缓存)将对象放入注册表。因此,以下是您可以做的:

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;
}
公共类文档注册{
私有映射注册表=新HashMap();
私有静态DocumentRegistry instace=新DocumentRegistry();
公共静态DocumentRegistry getInstance(){
返回实例;
}
公共无效注册表文档(字符串键,RecordingDocument文档){
注册表。put(键、文件);
}
公共记录文档getDocument(字符串键){
返回registry.get(key);
}
} 
//你的经纪人
公共静态最终字符串DOCUMENT\u KEY=“DOCUMENT”;
公共对象执行(ExecutionEvent事件)引发ExecutionException{
IHandlerService服务;
IWorkbenchWindow=HandlerUtil.getActiveWorkbenchWindowChecked(事件);
试一试{
RecordingDocument d=新的RecordingDocument(“TestProject”、“Tester”,true);
d、 记录();
MessageDialog.openInformation(
window.getShell(),
“JavaTV”,
“您现在正在录制。”);
DocumentsRegistry.getInstance().registerDocument(文档键,d);
}捕获(COREE){
e、 printStackTrace();
}
返回null;
}
//另一个处理程序
公共对象执行(ExecutionEvent事件)引发ExecutionException{
RecordingDocument d=DocumentsRegistry.getInstance().getDocument(文档\u键);
//用它做点什么
返回null;
}
如果希望支持并发录制,以便可以同时打开多个文档,则需要为每个文档生成密钥的解决方案