GWT:何时使用AsyncProxy <t>而不是AsyncProvider <t,f>?</t,f> </t>

时间:2012-11-02 18:48:47

标签: java gwt

我正试图围绕GWT的AsyncProvider<T,F>AsyncProxy<T>课程。我理解异步提供程序模式背后的概念:它允许您构造代码,使得独占片段(模块)与AsyncProvider实现相关联。然后,只要您想使用该模块,就可以针对AsyncProvider impl提供的API进行编码。很容易......

AsyncProxy让我失望。根据JavaDocs:

  

AsyncProxy类型用于在旨在与runAsync一起使用的类之间提供可达性障碍,同时维护简单的延迟同步API。在AsyncProxy上第一次调用实例方法将通过runAsync触发具体对象的实例化。

但这不是AsyncProvider本来应该做的吗?!?如果有人可以给我一个具体的实例,我将何时使用AsyncProxy而不是AsyncProvider,我认为事情会在一起,我能够理解其余的JavaDocs

1 个答案:

答案 0 :(得分:2)

AsyncProxy只是使用code splitting的另一种方式,例如它基本上是语法糖,可以用来代替GWT.runAsync

假设您有一些类能够显示一些带有分析的复杂弹出窗口。

public class InformationResolver {

    public void showAnalytics(String targetId){
        //lots of complicated logic here
    }         

}

我们知道此类提供的功能不是用户想要使用的第一件事。因此它是代码分割的完美候选者。并且它只有void方法,使用AsyncProxy实现它很容易。

首先,我们提取界面:

  interface InformationResolverIfc{ void showAnalytics(String targetId);}

原始类将实现此接口。比我们创建代理接口:

@ConcreteType(InformationResolver.class)
 interface ResolverProxy extends AsyncProxy<InformationResolverIfc>, InformationResolverIfc {}

现在,当我们在某个时间点我们想要调用showAnalytics方法时,我们会做以下事情:

InfomationResolverIfc resolver=GWT.create(ResolverProxy.class);
resolver.showAnalytics("gwt");

所以你在这里得到的是你可以在应用程序的任何地方自由而轻松地使用InformationResolver提供的功能,但是这个类的实现代码只有在第一次实际使用时才会被下载。而且您根本不必使用GWT.runAsync。只有一个问题,AsyncProxy只能用于只有void方法的类(因为你不能从尚未加载的类中获取任何东西)。