2012-09-28 25 views
2

這個問題是基於我的另一個問題得到答覆:https://stackoverflow.com/a/3060233/323357GWT編譯器 - 編譯單元和接口

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

我不認爲是這樣,但確實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; 
    } 
    

回答

1

不要擔心你的4例第3。在客戶端使用接口(或具有多個子類的類)沒有成本:通過分析哪些類實例化了可以輕鬆檢測到不必要的類。如有疑問,請檢查compile report

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

  • 同一個客戶端可以繼續與服務器的更新版本的工作(只要服務定義不變)
  • 服務器可以使用反射動態地生成對象:聲明類型的任何亞型(這是方式的主要原因反射不可用在客戶端)

的唯一途徑這段代碼大小的開銷都不能被淘汰,都是要麼

  • 放棄類型安全(您可以使用基於JSON的方法!)
  • 或在編譯期間分析服務器端並禁止傳輸動態生成的對象(這將需要在服務器上的對象實例化代碼時重新編譯GWT方改變)