GWT.create(SomeClass.class)
和new SomeClass()
之间的区别是什么?
为什么要使用一个而不是另一个?
答案 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。