通过使用具体类而不是接口来减少编译的js的大小

时间:2012-08-20 02:49:49

标签: class gwt size abstract

我已经读过GWT,指定返回具体实现的方法,例如:

public ArrayList<String> getList();

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

public List<String> getList();

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

我密切相关的问题是:

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

3 个答案:

答案 0 :(得分:6)

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

  
      
  • 这是真的吗? (以下问题假设确实如此)
  •   

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

  
      
  • 使用接口或每个应用程序的每个类的优化是什么?即
  •   

对于GWT RPC,每个应用程序。

  
      
  • 我是否只看到重构一个课程的好处?
  •   

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

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

<extend-configuration-property name="rpc.blacklist"
    value="-java.util.ArrayList" />  

答案 1 :(得分:2)

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

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

这证明了保存是真实的和每个应用程序(不是按服务)。

它还显示了它保存的多少(在这种情况下)。

答案 2 :(得分:0)

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

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