我已经读过GWT,指定返回具体实现的方法,例如:
public ArrayList<String> getList();
而不是通常首选的“抽象接口”,例如:
public List<String> getList();
导致GWT产生较小的编译javascript文件,因为客户端(即js)代码不必满足接口的所有已知实现(在List
的示例中,客户端代码将具有能够处理LinkedList
,ArrayList
,Vector
等),因此可以通过不编译未使用的实现来优化js。
我密切相关的问题是:
答案 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开发应用程序。在这种情况下,编译代码在使用接口时不会膨胀。