3

假设我有这样的东西

界面

Interface IsInterface {}

实现类

public ConcreteClassA implements IsInterface {

 InjectorA a, InjectorB c, InjectorC c;

 @Inject
 ConcreteClassA(InjectorA a, InjectorB b, InjectorC c) {
   this.a = a;
   this.b = b;
   .....
 }

}

public ConcreteClassB implements IsInterface {

 InjectorA a, InjectorB B, InjectorC C;

 @Inject
 ConcreteClassB(InjectorA a, InjectorB b, InjectorC c) {
   this.a = a;
   this.b = b;
   .....
 }

}

..然后我决定在我的 GWT module.gwt.xml 中使用 GWT 延迟绑定

//Pseudo XML Configuration
if (type is IsInterface) 
   if toggle == A then use ConcreteClass A else use ConcreteClassB

现在,当我尝试运行它时。它不起作用,因为 GWT 期望我的具体类 A 和 B 具有默认的 0 构造函数。所以,我在我的具体课程上尝试了以下内容

 @Inject
 InjectorA a; 
 @Inject
 InjectorB b;
 @Inject
 InjectorC c;

 ConcreteClassA() {

 }

它绕过了 0 构造函数错误,但是当我尝试使用 a、b 或 c 时,它给了我 NullPointerException。使其工作的一种方法是删除 @Inject 并像这样使用 GWT.create()

 InjectorA a, InjectorB b, InjectorC c;

 ConcreteClassA() {
   this.a = GWT.create(InjectorA.class);
   .....
   .....
 }

这会起作用,但是如果我的 InjectorA、InjectorB 和 InjectorC 没有 0 构造函数并且严重依赖@inject 怎么办。我不想遍历所有类来创建 0 个构造函数并用 GWT.create() 替换 @inject。必须有更好的方法来做到这一点。我在这里错过了什么吗?

4

1 回答 1

0

找到了解决方案

interface IsInterface {
 @Inject
 void init(InjectorA a, InjectorB b, ...);
}

public ConcreteClassA implements IsInterface {

 InjectorA a, InjectorB c, InjectorC c;
 ConcreteClassA() {}
 @Override
 public void init(InjectorA a, InjectorB b, ..) {
  this.a = a;
  this.b = b;
  ....
 }

}
于 2013-08-26T19:22:25.133 回答