在 GWT 中使用 I18N 时如何减少 gwt.create?

How to reduce gwt.create when using I18N in GWT?

我正在使用 I18N 进行一个新的相当大(但旧)的 GWT 项目:

protected Messages i18n = GWT.create(Messages.class);

我们有一个创建变量 I18N 的抽象 class,所有屏幕都在使用它,但只有屏幕,而不是回调、弹出窗口等。所以这导致超过 300 次调用此 GWT.create 来创建 i18n 变量。

有没有办法让这个调用更通用? GWT.create 是否使用大量资源?

方法GWT.create()在最坏的情况下只不过是对构造函数的调用。在 GC 语言中避免 new 小对象通常不是什么大问题 - 通常。

然而,这些 Messages 实现将是完全无状态的,并且只有一种可能的实现(每个排列,如果将所有可能的语言环境编译成相同的排列,则所有赌注都将关闭),因此编译器得到在这里要稍微聪明一点。在这种情况下,它注意到只有一个实现,并将所有方法设为静态。然后,由于没有实例方法,甚至不需要构造函数,因此所有对 GWT.create 的调用(无论如何都是 new GeneratedMessagesImpl() 可能最终会被完全删除)!

简而言之,不用担心 - 创建的用于保存和呈现这些字符串的 TextNodes 和 Elements 比这种简单类型的构造函数要昂贵得多永远是,即使没有编译器在他们身后。

如果你使用UiBinder做视图,你可以将资源注入到你的视图中使用。无需为每个消息 class.

显式调用 GWT.create

示例:

UiBinder XML 文件:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
   xmlns:gwt='urn:import:com.google.gwt.user.client.ui'>
   <ui:with type="com.example.i18n.Messages" field="mes"></ui:with>
   <gwt:HTMLPanel>

   </gwt:HTMLPanel>
</ui:UiBinder> 

Java 查看:

    public class ExampleUiView extends Composite {

    // ... fields

    @UiField
    Messages res; // field name must correspond to UiBinder.xml name

    }

然后你可以使用你的 res 对象被注入视图和 XML 骨架。