我有以下界面:
public interface ResultEvaluationInterface {
public void evaluateResults(Event e);
}
并且我想根据我的 Event.type
不同的类在我的类中注入(inject)相同的实现。类似的东西:
@Stateless
@LocalBean
public class ResultEvaluation implements ResultEvaluationInterface {
@Override
public void evaluateResults(Event e) {
switch (e.getType()) {
case Type.Running:
// inject and call ResultEvaluationRunningEJB.evaluateResults(e)
case Type.Swimming:
// inject and call ResultEvaluationSwimmingEJB.evaluateResults(e)
default:
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
ResultEvaluationRunningEJB
和 ResultEvaluationSwimmingEJB
都实现了该接口(interface)。有人知道如何以好的方式做到这一点吗?
最佳答案
如果您真的想使用硬编码的 if 语句在生产事件和开发事件之间切换,您可以使用 CDI 限定符,只需将这两个实现注入(inject) Facade 即可:
@Stateless
@LocalBean
public class ResultEvaluationFacade {
@Inject
@Development
private ResultEvalutationInterface dev;
@Inject
@Production
private ResultEvalutionInterface prod;
@Override
public void evaluateResults(Event e) {
switch (e.getType()) {
case Type.Production:
prod.evaluteResult(e);
break;
case Type.Development:
dev.evaluteResult(e);
break;
default:
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
并定义你的两个实现:
@Development
public class ResultEvaluationDevelopment implements ResultEvaluationInterface {
...
}
@Production
public class ResultEvaluationDevelopment implements ResultEvaluationInterface {
...
}
不过,我会考虑使用模拟 Maven 项目来容纳这两个独立的实现。
或者,您可以使用不同的 CDI 事件类型,如下所示。
public void observeDevEvent(@Observe DevEvent event) {
//do stuff.
}
public void observeProdEvent(@Observe ProdEvent event) {
//do stuff
}
触发事件看起来像这样:
@Inject
private Event<ProdEvent> prodEvent;
public void someMethod() {
ProdEvent pe = new ProdEvent()
// set some data on ProdEvent
prodEvent.fire(pe);
}
注意事件也可以与限定符一起使用,因此您还可以向事件添加限定符注释,而不是实现两种不同类型的事件。
@Inject
@Production
private Event<MyEvent> event;
并监听@Prodcution 事件;
public void handleProdEvent(@Observer @Production MyEvent myEvent) {
// do Stuff.
}
对于 bean 的惰性实例化,您可以使用 CDI 实例注入(inject)。
@Inject
private Instance<BeanA> beanA;
....
public void doStuff(Event e) {
...
case Type.Production:
//lazily evaluates and instantiatiates bean.
beanA.get().evaluateResult(e);
}
关于Java ee 接口(interface)条件注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474570/