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

Posted

技术标签:

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

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

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

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

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

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

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

【讨论】:

以上是关于GWT 编译器 - 编译单元和接口的主要内容,如果未能解决你的问题,请参考以下文章

使用 GWT 编译器的 Java 到 JavaScript

GWT 所需的 JDK 和 JRE 最低版本(编译和运行)

我在 GWT 编译器中编译源代码时遇到错误。“com.reveregroup.gwt.imagepreloader.FitImage 类型没有可用的源代码”

GWT 2.8.2编译器异常

gwt编译错误

GWT 背景研究 项目帮助!