【问题标题】:GWT compiler - compilation units and interfacesGWT 编译器 - 编译单元和接口
【发布时间】:2012-09-28 09:04:19
【问题描述】:

这个问题是基于我收到的另一个问题的答案: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;
    }
    

【问题讨论】:

    标签: gwt compiler-construction compilation compilationunit


    【解决方案1】:

    不要担心 4 个示例中的前 3 个。在客户端使用接口(或具有许多子类的类)是免费的:通过分析曾经实例化的类,可以轻松检测到不必要的类。如有疑问,请检查compile report

    但是,对于服务器端调用,在 GWT-RPC 中这是不可能:客户端无法知道服务器将创建哪些实例。考虑一下

    • 同一客户端可以继续使用服务器的更新版本(只要服务定义不变)
    • 服务器可以使用反射来动态生成对象:声明类型的任何子类型(顺便说一下,这是客户端无法使用反射的主要原因)

    唯一可以消除这种代码大小开销的方法是

    • 放弃类型安全(您可以使用基于 JSON 的方法!)
    • 或在编译期间分析服务器端并禁止传输动态生成的对象(这将需要在服务器端的对象实例化代码更改时重新编译 GWT)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2012-03-13
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多