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

Does GWT.create() always create a new object in browser memory?

假设我这样做:

VeryLargeObject o1 = GWT.create(VeryLargeObject.class();
VeryLargeObject o2 = GWT.create(VeryLargeObject.class();
...
VeryLargeObject o1000 = GWT.create(VeryLargeObject.class();

其中 VeryLargeObject 是 GWT 资源接口,extends com.google.gwt.i18n.client.Messages

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

编辑:我在 docs 中发现了这个,但我仍然不清楚其行为:

Using GWT.create(class) to "instantiate" an interface that extends Messages returns an instance of an automatically generated subclass that is implemented using message templates selected based on locale.

根据 GWT Javadoc,create() 方法将return一个新实例,所以我怀疑它是同一个对象

http://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/GWT.html#create(java.lang.Class)

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

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