假设我这样做:
VeryLargeObject o1 = GWT.create(VeryLargeObject.class();
VeryLargeObject o2 = GWT.create(VeryLargeObject.class();
...
VeryLargeObject o1000 = GWT.create(VeryLargeObject.class();
其中VeryLargeObject
是extends com.google.gwt.i18n.client.Messages
。
此代码是否会在浏览器中创建1000个新对象实例?或者GWT是否足够聪明,可以检测到VeryLargeObject
是不可变的并且每次都重复使用它的实例?
编辑:我在docs中发现了这一点,但我的行为仍然不明确:
使用GWT.create(class)来实现"实例化"扩展Messages的接口返回一个自动生成的子类的实例,该子类是使用基于语言环境选择的消息模板实现的。
答案 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)