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

时间:2016-02-23 15:49:53

标签: java gwt internationalization

我正在使用类似I18N的一个新的,相当大的(但是旧的)GWT项目:

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

我们有一个抽象类,它创建变量I18N,所有屏幕都使用它,但只有屏幕,而不是回调,弹出等等。所以这导致超过300次调用这个GWT.create来制作i18n变量。 / p>

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

2 个答案:

答案 0 :(得分:4)

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

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

简而言之,不要担心 - 创建的TextNodeElement用于保存和呈现这些字符串的成本远远高于这种简单类型的构造函数即使没有他们背后的编译器也会如此。

答案 1 :(得分:2)

如果您将UiBinder用于视图,则可以将资源注入视图以供使用。没有必要为每个Message类调用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 View:

    public class ExampleUiView extends Composite {

    // ... fields

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

    }

然后,您可以将res对象注入View和XML骨架。