2015-07-20 45 views
5

假设我做的:GWT.create()总是在浏览器内存中创建一个新对象吗?

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但行为仍不清楚对我说:

使用GWT.create(类)“实例”扩展信息的接口返回一个自动生成的一个实例使用基于区域设置选择的消息模板实现的子类。

+1

您可以打印o1.toString(),o2.toString()等,以便检查是否打印相同的值。如果是,那么他们是指同一个对象。 – alkis

+1

@alkis是的,在开发模式下,新对象的哈希码是不同的。但这并不能保证在生产模式下这些对象不会引用下面的同一个对象。 –

回答

4

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

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

2

按照GWT的Javadoc的创建()方法会返回一个新的实例,所以我怀疑这是同一个对象

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

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – duffy356

+3

我确实发布了“答案的基本部分”:“**返回: 新实例**,必须将其转换为请求的类”。这不是一个厚厚的文字 – 2015-07-20 07:22:38

相关问题