在GWT中,为什么不应该';方法是否返回接口?

在GWT中,为什么不应该';方法是否返回接口?,gwt,Gwt,在中,演示者很快说方法的签名应该返回具体类型,而不是接口 从我在视频中听到的,这与GWT Java到Javascript编译器有关 这一选择背后的原因是什么 方法签名中的接口对编译器有什么作用 哪些方法可以返回接口而不是具体类型,哪些方法最好返回具体实例 正如您所说,这与gwt编译器有关编辑:但是,正如Daniel在下面的评论中所指出的,这通常不适用于gwt编译器,而仅适用于使用gwt-RPC的情况。 如果将List而不是ArrayList声明为返回类型,gwt编译器将在编译代码中包含完整的

在中,演示者很快说方法的签名应该返回具体类型,而不是接口

从我在视频中听到的,这与GWT Java到Javascript编译器有关

  • 这一选择背后的原因是什么
  • 方法签名中的接口对编译器有什么作用
  • 哪些方法可以返回接口而不是具体类型,哪些方法最好返回具体实例

正如您所说,这与gwt编译器有关编辑:但是,正如Daniel在下面的评论中所指出的,这通常不适用于gwt编译器,而仅适用于使用gwt-RPC的情况。

如果将List而不是ArrayList声明为返回类型,gwt编译器将在编译代码中包含完整的列表层次结构(即实现List的所有类型)。如果使用ArrayList,编译器只需要包含ArrayList层次结构(即实现ArrayList的所有类型——通常只是ArrayList本身)。使用一个接口而不是一个具体的类,您将在编译时间和生成代码的大小(以及每个用户在运行应用程序时必须下载的代码量)方面付出代价

您还询问了原因:如果使用接口(而不是具体的类),编译器在编译时不知道将使用这些接口的哪些实现。因此,它包括所有可能的实现

关于您的最后一个问题:所有方法都可以声明为返回接口(这就是您想要的,对吗?)。但是,上述处罚适用

顺便说一句:据我所知,这个问题并不局限于方法。它适用于所有类型声明:变量、参数。无论何时使用接口声明某些内容,编译器都将包含子接口和实现类的完整层次结构。(很明显,如果您只使用一个或两个实现类来声明自己的接口,那么您不会受到太大的惩罚。这就是我在GWT中使用接口的方式。)

简而言之:尽可能使用具体的类


(小建议:如果你在看视频时给出时间戳会有帮助。)

这一点和其他性能提示在谷歌IO 2011-上展示过

在大约7分钟的时间点,讲话地址为“RPC类型爆炸”:


出于某种原因,我原以为GWT编译器会再次对其进行优化,但似乎我弄错了。

这与RPC序列化有关。请看演示文稿中的7分钟时点或之后的内容。演讲者不知道他为什么这样做。他称之为“迷信”。代码膨胀只适用于用于代码生成的类(例如GWT-RPC)。一般来说,编译器在使用接口时不会膨胀Daniel,你说得对!我完全忘记了在没有GWT-RPC的情况下可能会使用GWT。@danielkurka-你知道在更新版本的GWT中,这个GWT-RPC接口膨胀是否仍然是一个问题吗?对于2.8.0,这仍然是正确的吗?对于2.8.0,这仍然是正确的吗?