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

58

GWT.create(SomeClass.class)new SomeClass()有什么区别?

为什么你会选择使用其中一种而不是另一种?

2个回答

65

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

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

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


2
谢谢您的回复 - 因此(在基本情况下),如果实现不会因为不同的语言环境/浏览器而改变,请使用new;如果将有多个实现,请使用create。 - RodeoClown
实际上,即使不使用延迟绑定,您也可以使用GWT.create。如果未找到延迟绑定规则,则GWT编译器将把其翻译为“ new”运算符。这在创建具有扩展点的库或组件以供其他开发人员稍后使用时非常有用。 - Gilberto Torrezan

29

GWT.create使用延迟绑定工作来弥补缺乏反射支持的不足。

根据FAQ

延迟绑定是Google Web Toolkit对Java反射的回答。

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

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

由于动态绑定作为一种技术对GWT不可用,因此GWT使用延迟绑定。可以将其视为“在编译时而不是执行时间进行的动态类加载”。当GWT编译Java应用程序时,它确定必须支持的所有不同“特性”,并为该特定配置生成单独的、高度简化的应用程序版本。例如,它为Firefox生成与Opera不同的应用程序文件的版本。


不仅如此,而且大多数依赖于代码生成的框架(不仅是为了绕过反射的缺乏)都使用GWT.create方法。 - Gilberto Torrezan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接