GWT.create()总是在浏览器内存中创建一个新对象吗?

Bab*_*yan 5 java gwt new-operator

假设我这样做:

VeryLargeObject o1 = GWT.create(VeryLargeObject.class();
VeryLargeObject o2 = GWT.create(VeryLargeObject.class();
...
VeryLargeObject o1000 = GWT.create(VeryLargeObject.class();
Run Code Online (Sandbox Code Playgroud)

哪个VeryLargeObject是GWT资源接口extends com.google.gwt.i18n.client.Messages.

此代码是否会在浏览器中创建1000个新对象实例?或者GWT是否足够智能来检测VeryLargeObject不可变的并且每次都重复使用它的1个实例?

编辑:我在文档中发现了这个,但我的行为仍然不明确:

使用GWT.create(class)"实例化"扩展Messages的接口返回自动生成的子类的实例,该子类使用基于locale选择的消息模板实现.

Tho*_*yer 4

是的,GWT.create()每次都会返回一个新实例。但是一个好的生成器可以做到这一点,以便可以在编译的代码中对其进行优化。

GWT 编译器要做的第一件事就是收紧类型(重写代码以使用尽可能最具体的类;在这种情况下,消息接口的所有使用都将替换为生成的实现),然后使方法静态(除了当需要动态调度时,即实际使用多态性)。
对于 I18N Messages 接口,因为生成的类没有状态并且其构造函数没有副作用,这意味着可以优化实例,并且只有静态方法保留在代码中(当它们稍后不内联时)。
更“复杂”的情况(例如客户端捆绑、CSS 资源)实际上将使用“静态”,因此实例本身可以再次进行优化,最终无论您创建 1000 个实例还是仅共享一个实例都没有关系。