Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从EclipseRCP中的一部分分离UI事件侦听:如何正确执行?_Java_Eclipse_Eclipse Plugin_Eclipse Rcp_E4 - Fatal编程技术网

Java 从EclipseRCP中的一部分分离UI事件侦听:如何正确执行?

Java 从EclipseRCP中的一部分分离UI事件侦听:如何正确执行?,java,eclipse,eclipse-plugin,eclipse-rcp,e4,Java,Eclipse,Eclipse Plugin,Eclipse Rcp,E4,我有一个巨大的部分源代码,我必须在一个地方接触。它违反了很多原则,所以我想至少提取我必须修改的函数,它是一个@UIEventTopic处理程序。没有测试,我想在这里添加它们,这样我知道我不会破坏现有的功能 我想离开这一点: public class MyPart { ... @Inject @Optional public void event(@UIEventTopic(EVENT) EventParam p) { ... } } 对这样的事情: public

我有一个巨大的
部分
源代码,我必须在一个地方接触。它违反了很多原则,所以我想至少提取我必须修改的函数,它是一个
@UIEventTopic
处理程序。没有测试,我想在这里添加它们,这样我知道我不会破坏现有的功能

我想离开这一点:

public class MyPart {
  ...

  @Inject
  @Optional
  public void event(@UIEventTopic(EVENT) EventParam p) {
    ...
  }
}
对这样的事情:

public class MyPart {
  ...
}

public class MyEventHandler { 
  @Inject
  @Optional
  public void event(@UIEventTopic(EVENT) EventParam p, MyPart part) {
    ...
  }
}
使用EclipseDI,我看不到创建处理程序类实例的简单方法。它不能是
@Singleton
,因为它是一个可以有多个实例的
部分
,而将处理程序添加到
@PostConstruct
中的
@IEclipseContext
很难看,因为它在部分和处理程序之间添加了循环依赖关系。有没有一种神奇的方法可以让我通过e4xmi文件强制执行实例化,或者其他一些方法


我目前的解决方案是将纯粹的功能提取到实用程序bean中,返回数据并在部件上设置,但这也不太好(需要大量额外的空检查、ifs等)。

我不完全确定我是否理解您的问题,但是,我将这样做:

提取代理

event()
中的代码移动到
MyEventHandler
以便
MyClass
完全委托事件处理

公共类MyPart{
@注入
@可选的
公共无效事件(@UIEventTopic(event)EventParam param){
新的MyEventHandler().handleEvent(this,param);
}
}
类MyEventHandler{
void handleEvent(MyPart、EventParam参数){
//event()中的所有代码都在这里
}
}
这应该是一个足够安全的重构,不需要测试就可以完成——最后,你没有选择,因为没有测试

确保现状

现在我将为
handleEvent()
编写测试,模拟
MyPart
所需的方法,从而确保不会破坏现有行为

实施新功能

之后,我将能够以测试驱动的方式对MyEventHandler::handleEvent进行所需的更改

清理


然后,我将从
MyPart
中提取一个接口,该接口只有
MyEventHandler
执行其工作所需的那些方法。如果说接口太大,那就意味着还有更多的重构工作要做。

Hi Rüdiger,是的,thx很多。最后,我们遇到了类似的情况——期望通过该部分,因为模仿会使测试有点臃肿。所以我们创建了一个结果对象,我正在测试它。Thx的见解。