为什么使用GWT.create()而不是new?

时间:2010-02-11 05:05:30

标签: gwt new-operator

GWT.create(SomeClass.class)new SomeClass()之间的区别是什么?

为什么要使用一个而不是另一个?

2 个答案:

答案 0 :(得分:64)

GWT.create由GWT编译器用于延迟绑定。延迟绑定是GWT编译器的一个特性,它通过在编译时生成许多版本的代码来工作,在运行时自举期间,只有一个需要由特定客户端加载。

对于依赖于此特定用例的情况,您应该只使用GWT.create。例如,在创建RPC类时:(MyServiceAsync)GWT.create(MyService.class)。在所有其他情况下,请使用new

有关更多信息,请查看延迟绑定的GWT页面:http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsDeferred.html

答案 1 :(得分:29)

GWT.create使用延迟绑定工作来解决缺乏反射支持的问题。

根据FAQ

  

Deferred Binding是Google Web Toolkit对Java反射的回答。

     

最简单的方法是从用例开始解释延迟绑定。每个Web浏览器都有自己的特性,通常很多。 (完全无法管理的数量是GWT首先要解决的问题。)处理特性的标准Java方法是将自定义代码封装到子类中,每个支持的浏览器都有一个子类。在运行时,应用程序将使用反射和动态类加载为当前环境选择适当的子类,加载类,创建实例,然后在程序持续时间内将该实例用作服务提供者。

     

这确实是GWT所做的。但是,GWT应用程序最终运行的JavaScript环境不支持动态类加载(也称为动态绑定)。您当然可以在生成的JavaScript代码中包含支持每个浏览器的代码,但为此,您必须包含对所有浏览器的支持。浏览器位于单个应用程序文件中。为什么一个Opera用户必须下载特定于Firefox的代码,当她根本不​​需要它的时候?

     

由于动态绑定不可用作GWT的技术,因此GWT使用延迟绑定。想到这一点的一种方法是“在编译时而不是执行时间发生的动态类加载”。当GWT编译器编译Java应用程序时,它会确定它必须支持的所有不同的“特性”,并为该特定配置生成一个单独的,紧密简化的应用程序版本。例如,它为Firefox生成不同版本的应用程序文件,而不是Opera。