2

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

1 回答 1

1

不要担心 4 个示例中的前 3 个。在客户端使用接口(或具有许多子类的类)没有成本:通过分析哪些类曾经实例化,可以轻松检测到不必要的类。如果有疑问,请检查编译报告

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

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

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

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