簡體   English   中英

GWT編譯器-編譯單元和接口

[英]GWT compiler - compilation units and interfaces

這個問題基於我收到的另一個問題的答案: https : //stackoverflow.com/a/3060233/323357

我的理解是,使用接口聲明服務中的返回類型和參數類型會迫使編譯器生成多個編譯單元,這會增加我的編譯時間和生成文件的大小。

我認為情況並非如此,但是最新版本的gwt編譯器(2.4-2.5)是否可以檢測不必要的編譯單元...

  • 局部變量和參數?

     void someFunction() { ArrayList<String> list = new ArrayList<String>(); privateFunction(list); //only use of the private function } private void privateFunction(List<String> list) { Set<Integer> set = new HashSet<Integer>(); //do stuff without reallocating list or set } 
  • 對於最終成員?

     private final Interface member = new InterfaceImpl(); @override Interface getInterface() { return this.member; } 
  • 返回類型?

     List<String> myFunction() { List<String> ret = new ArrayList<String>(); //do stuff and fill the list return ret; } 
  • 在服務中?

     //Service Interface List<String> myService(); //Service implementation List<String> myService() { List<String> ret = new ArrayList<String>(); //do stuff and fill the list return ret; } 

不必擔心您的4個示例中的前3個。 在客戶端使用接口(或具有許多子類的類)是沒有成本的:通過分析曾經實例化的類,可以輕松地檢測出不必要的類。 如有疑問,請檢查一份匯編報告

但是,對於服務器端調用,這在GWT-RPC中是不可能的 :客戶端無法知道服務器將創建哪些實例。 考慮一下

  • 同一客戶端可以繼續使用服務器的更新版本(只要服務定義不變)
  • 服務器可以使用反射來動態生成對象:已聲明類型的任何子類型(這是客戶端無法使用反射的主要原因)

可以消除此代碼大小開銷的唯一方法是

  • 放棄類型安全性(您可以使用基於JSON的方法!)
  • 或在編譯和禁止過程中分析服務器端以傳輸動態生成的對象(只要服務器端的對象實例化代碼發生更改,這都將需要重新編譯GWT)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM