2015-07-20 29 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

相關問題