GWT.create vs new operator alternative

时间:2017-09-19 12:08:31

标签: gwt smartgwt

我必须在GWT.create中使用我的类的参数化构造函数,但GWT只调用默认构造函数。我想通过调用new Class(参数列表)来替换GWT.create的调用。这是在GWT延迟绑定中编码的正确方法。

代码如下:

public interface ProductSelectorMetaFactory extends BeanFactory.MetaFactory {
        BeanFactory<ProductSelectorTile> getProductSelectorTileFactory();
    }

public CustomTileGrid(DataSource cardViewDataSource, ProductSelectorTile tileType, String fieldState,
            List<DetailViewerField> list) {
        setDataSource(cardViewDataSource);
        setAutoFetchData(true);
        GWT.create(ProductSelectorMetaFactory.class);
        setTileConstructor(tileType.getClass().getName());
    }

这里我想使用ProductSelectorTile类的参数构造函数。我该怎么用呢。

感谢任何帮助。 我可能不善于解释我目前的问题,但如果您对此问题有任何疑问,请随意。

1 个答案:

答案 0 :(得分:0)

我会使用一个没有可由GWT.create()创建的参数的辅助类。辅助类可以有不同的实现 - 与原始类(带参数)相同。现在,helper类的每个实现都可以创建原始类的正确实例。

假设您需要为每个用户代理实现不同的实现。在<module>.gwt.xml中你会有这个(见documentation):

<replace-with class="<module.path>.MyClassHelperGecko">
  <when-type-is class="<module.path>.MyClassHelper" />
  <when-property-is name="user.agent" value="gecko1_8" />
</replace-with>

<replace-with class="<module.path>.MyClassHelperSafari">
  <when-type-is class="<module.path>.MyClassHelper" />
  <when-property-is name="user.agent" value="safari" />
</replace-with>

...

助手类及其实现:

public class MyClassHelper {
    MyClassInterface getInstance(String param) {
        return null;
    };
}

public class MyClassHelperGecko extends MyClassHelper {
    @Override
    public MyClassInterface getInstance(String param) {
        return new MyClassGecko(param);
    }
}

public class MyClassHelperSafari extends MyClassHelper {
    @Override
    public MyClassInterface getInstance(String param) {
        return new MyClassSafari(param);
    }
}

...

最后实现了基类:

public interface MyClassInterface {
    // ...
}

public class MyClassGecko implements MyClassInterface {
    public MyClassGecko(String param) {
        Window.alert("Gecko implementation; param = " + param);
        // ...
    }
}

public class MyClassSafari implements MyClassInterface {
    public MyClassSafari(String param) {
        Window.alert("Safari implementation; param = " + param);
        // ...
    }
}

...

像这样使用它,你会看到不同用户代理的不同警报:

MyClassHelper helper = GWT.create(MyClassHelper.class);
helper.getInstance("abc");

这是一般的Deferred Binding Using Replacement解决方案。还有Deferred Binding using Generators方法。一旦你明白了,你就可以选择最适合自己的方法。