GWT编译器 - 编译单元和接口

时间:2012-09-28 09:04:20

标签: gwt compiler-construction compilation compilationunit

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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