5

我已经为 GWT 阅读了该内容,指定了返回具体实现的方法,例如:

public ArrayList<String> getList();

而不是通常首选的“抽象接口”,例如:

public List<String> getList();

导致 GWT 生成一个较小的已编译 javascript 文件,因为客户端(即 js)代码不必满足接口的所有已知实现(在 的示例中List,客户端代码必须能够处理LinkedListArrayListVector、等),因此它可以通过不编译未使用的实现来优化 js。

我密切相关的问题是:

  • 这是真的?(以下问题假设真)
  • 是使用接口的每个类还是每个应用程序的优化?IE
  • 我看到重构一个类的好处吗?或者
  • 一旦所有客户端类都被重构为不使用接口,我是否只会看到好处?
4

3 回答 3

6

以下假设您使用该接口作为 GWT RPC 服务签名的一部分。我认为如果你在 GWT RPC 服务的签名中不使用接口,使用类而不是接口的影响应该是最小的(例如 GWT 编译器只会编译使用的实现)

  • 这是真的?(以下问题假设为真)

是的,当 GWT 编译器“知道”哪些类可能从服务器发送到客户端时,它的输出会变小。

  • 是使用接口的每个类还是每个应用程序的优化?IE

在 GWT RPC 的情况下,每个应用程序。

  • 我看到重构一个类的好处吗?

是的,如果接口需要包含许多类的代码,则由一个实现替换的接口可以将生成的代码大小减少几 kb。

但是,除了使用实现而不是接口之外,还可以在模块定义文件中定义类的“黑名单”,以明确规避在生成的代码中包含实现:类似于

<extend-configuration-property name="rpc.blacklist"
    value="-java.util.ArrayList" />  
于 2012-08-20T04:56:24.957 回答
2

我刚刚根据webAppCreator生成的示例应用程序进行了测试,但我添加了 3 个简单的服务,它们返回List<String>ArrayList<String>,具体取决于构建。

结果是,使用所有服务从编译的 javascript 中ArrayList<String> 节省了大约 5Kb,而不是使用任何混合返回类型。

这证明节省是真实的,并且是针对每个应用程序(而不是针对每个服务)。

它还显示了它节省了多少(在这种情况下)。

于 2012-08-20T06:09:00.037 回答
0

这对于一般的 GWT 编译器来说并不实际。这种方法仅适用于与代码生成一起使用的类。例如,在使用远程过程调用时。有关更多详细信息,请参阅此问题。因此,如果您声明一个接口而不是具体类作为返回类型,编译器会在您编译的代码中包含所有可能的实现。这增加了编译时间和生成的代码量。

实际上,可以使用没有 RPC 的 GWT 开发应用程序。在这种情况下,编译后的代码在使用接口时不会膨胀。

于 2012-08-20T07:00:07.217 回答