代码之家  ›  专栏  ›  技术社区  ›  RodeoClown

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

  •  57
  • RodeoClown  · 技术社区  · 15 年前

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

    你为什么要用一个而另一个?

    2 回复  |  直到 14 年前
        1
  •  64
  •   Hilbrand Bouwkamp    15 年前

    GWT.create 被GWT编译器用于延迟绑定。延迟绑定是GWT编译器的一个特性,它通过在编译时生成许多版本的代码来工作,其中只有一个版本需要在运行时的引导过程中由特定的客户机加载。

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

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

        2
  •  29
  •   Robert Munteanu    15 年前

    GWT.create 由于缺少反射支持,因此将延迟绑定工作应用到周围。

    根据 FAQ :

    延迟绑定是谷歌Web工具包对Java反射的回答。

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

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

    由于动态绑定不能作为GWT的一种技术,GWT使用延迟绑定。一种考虑的方式是“在编译时而不是执行时间发生的动态类加载”。当GWT编译器编译Java应用程序时,它决定了它必须支持的所有不同的“特质”,并为该特定配置生成一个单独的、紧密流线型的应用程序版本。例如,它为firefox生成的应用程序文件版本与为opera生成的应用程序文件版本不同。