在 GWT 中,为啥方法不应该返回接口?
Posted
技术标签:
【中文标题】在 GWT 中,为啥方法不应该返回接口?【英文标题】:In GWT, why shouldn't a method return an interface?在 GWT 中,为什么方法不应该返回接口? 【发布时间】:2011-05-19 13:13:46 【问题描述】:在this video from Google IO 2009 中,演示者很快说方法的签名应该返回具体类型而不是接口。
根据我在视频中听到的内容,这与 GWT Java-to-javascript 编译器有关。
做出这种选择的原因是什么? 方法签名中的接口对编译器有什么作用? 哪些方法可以返回接口而不是具体类型,哪些方法最好返回具体实例?【问题讨论】:
这与 RPC 序列化有关。见***.com/questions/3059787/… 查看演示文稿中的 7 分钟点或紧接其后。演讲者并不确切地知道他为什么这样做。他称之为“迷信”。 【参考方案1】:正如您所说的,这与 gwt 编译器有关。 编辑:但是,正如 Daniel 在下面的评论中指出的那样,这通常不适用于 gwt-compiler,而仅适用于使用 GWT-RPC 时。
如果您声明 List 而不是 ArrayList 作为返回类型,gwt-compiler 将在您的编译代码中包含完整的 List-hierarchy(即所有实现 List 的类型)。如果您使用 ArrayList,编译器只需要包含 ArrayList 层次结构(即实现 ArrayList 的所有类型 - 通常只是 ArrayList 本身)。使用接口而不是具体类,您将在编译时间和生成代码的大小(以及每个用户在运行您的应用程序时必须下载的代码量)方面付出代价。
您还问了原因:如果您使用接口(而不是具体类),编译器在编译时不知道将使用这些接口的哪些实现。因此,它包括所有可能的实现。
关于您的最后一个问题:所有方法都可以声明为返回接口(这就是您所说的,对吗?)。但是,上述处罚适用。
顺便说一句:据我了解,这个问题不仅限于方法。它适用于所有类型声明:变量、参数。每当您使用接口声明某些内容时,编译器都会包含子接口和实现类的完整层次结构。 (所以很明显,如果你声明自己的接口只有一两个实现类,那么你不会受到很大的惩罚。这就是我在 GWT 中使用接口的方式。)
简而言之:尽可能使用具体类。
(小建议:如果您在参考视频时提供时间戳会有所帮助。)
【讨论】:
代码膨胀仅适用于用于代码生成的类(例如 GWT-RPC)。一般来说,使用接口时编译器不会膨胀 Daniel,你是对的!我完全忘记了可以在没有 GWT-RPC 的情况下使用 GWT。 @danielkurka - 你知道这个 GWT-RPC 接口膨胀在最新版本的 GWT 中是否仍然是一个问题吗? 2.8.0 仍然如此吗?【参考方案2】:此和其他性能提示已在 Google IO 2011 - High-performance GWT 上展示。
在大约 7 分钟的时候,演讲提到了“RPC 类型爆炸”:
出于某种原因,我认为 GWT 编译器会再次对其进行优化,但看来我错了。
【讨论】:
2.8.0 仍然如此吗?以上是关于在 GWT 中,为啥方法不应该返回接口?的主要内容,如果未能解决你的问题,请参考以下文章
GWT TypeOracle.getTypes 不返回所有类型