假设我有一个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 :(得分: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;
}
如果您想支持并发录制,以便可以同时打开许多文档,则需要一个解决方案来为每个文档生成密钥。