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

时间:2015-07-20 06:51:39

标签: java gwt new-operator

假设我这样做:

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

其中VeryLargeObjectextends com.google.gwt.i18n.client.Messages

的GWT资源接口

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

编辑:我在docs中发现了这一点,但我的行为仍然不明确:

  

使用GWT.create(class)来实现"实例化"扩展Messages的接口返回一个自动生成的子类的实例,该子类是使用基于语言环境选择的消息模板实现的。

2 个答案:

答案 0 :(得分:4)

是的,GWT.create()每次都会返回一个新实例。 但是一个好的生成器可以使它在编译代码中得到优化。

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

答案 1 :(得分:2)

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

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