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

     2023-02-16     160

关键词:

【中文标题】通过使用具体类而不是接口,编译后的 js 的大小减少了多少【英文标题】:By how much is the compiled js reduced in size by using concrete classes instead of interfaces 【发布时间】:2012-08-20 02:49:48 【问题描述】:

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

public ArrayList<String> getList();

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

public List<String> getList();

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

与我密切相关的问题是:

这是真的吗? (以下问题假设它正确的) 是针对使用接口的每个类还是针对每个应用程序进行优化?即 我看到重构一个类的好处了吗?或 只有将所有客户端类重构为不使用接口后,我才能看到好处吗?

【问题讨论】:

测试这个很容易。 【参考方案1】:

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

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

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

是针对使用接口的每个类还是针对每个应用程序进行优化?即

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

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

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

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

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

【讨论】:

【参考方案2】:

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

结果是让所有服务使用ArrayList&lt;String&gt;从编译的 javascript 中节省了大约 5Kb,而不是使用任何返回类型的组合。

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

传递实现类而不是接口时的 MissingMethodException

...46【问题描述】:我正在开发一个关于Jira工作流的脚本(使用AdaptavistScriptrunnerv.6.34),我遇到了一个问题,即groovy不接受接口实 查看详情

一个类实现两个接口,如何用spring实例化

...类实现两个接口,如何用spring实例化spring一般情况下建议使用接口来接受具体的实现类,多态性,这样做是为了依赖接口降低耦合如果你的实现类两个接口那么你可以直接实例化类,比如你的配置文件里面<beanid="localeResolver&... 查看详情

带有 POJO 类而不是接口的 GWT AutoBean

】带有POJO类而不是接口的GWTAutoBean【英文标题】:GWTAutoBeanwithPOJOclassinsteadofinterface【发布时间】:2011-06-0707:03:44【问题描述】:我希望有人可以为我的问题提出一个简单的解决方案。我有一个POJO,比如说:publicclassPersonprivateStrin... 查看详情

桥接模式

...口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。ConcreteImplementor具体实现类:具体实现Implementor接... 查看详情

无法将 osgi 服务 bean 公开为类而不是接口

】无法将osgi服务bean公开为类而不是接口【英文标题】:unabletoexposeosgiservicebeanasclassnotinterface【发布时间】:2019-03-0205:27:44【问题描述】:我想将springbean从一个捆绑上下文导出到另一个。当这个bean没有像MongoClient这样的接口时,... 查看详情

重构以避免在使用抽象类而不是接口时进行多重继承(代码片段)

...“Clickable”。(我知道,在这一点上,有些人可能会说“使用界面”,例如IClickable。但是现在,请将该建议放在一边。)Clickable的意思是抽象类,我希望提供一些默认功能。Button类(显然)不能从DisplayObject和Clickable继承。一个... 查看详情

51单片机程序和变量存储位置

一、概念理清使用环境:keil2,生成的代码大小如下,data保存于内部RAM中,xdata保存于外部扩展SRAM中,code保存于FLASH中。51单片机涉及的存储介质:RAM:内部RAM,每种51单片机都应该有,共256字节。大小固定SRAM:内存,掉电消失,外部... 查看详情

使用嵌套类而不是多重继承,C++

】使用嵌套类而不是多重继承,C++【英文标题】:UsingNestedClassesInsteadofMultipleInheritance,C++【发布时间】:2016-01-1209:12:59【问题描述】:我正在尝试使用嵌套类而不是多重继承。我正在遵循书中的建议,但在构造函数中不断出现错... 查看详情

为啥java的一些概念需要使用包装类而不是原始数据类型[重复]

】为啥java的一些概念需要使用包装类而不是原始数据类型[重复]【英文标题】:Whysomeconceptsofjavaneedstousewrapperclassinsteadofprimitivedatatypes[duplicate]为什么java的一些概念需要使用包装类而不是原始数据类型[重复]【发布时间】:2021-07-0... 查看详情

使用元类而不是工厂模式

】使用元类而不是工厂模式【英文标题】:Usingmetaclassesinsteadoffactorypattern【发布时间】:2021-12-2712:26:01【问题描述】:假设我们有一个具有不同CarTypes的实体(Car):classCarTypes(Enum):SUV=\'suv\'SPORT=\'sport\'@dataclassclassCar:id:UUIDtype:CarTy... 查看详情

使用类而不是 ID

】使用类而不是ID【英文标题】:UsingclassesinsteadofIDs【发布时间】:2016-01-3110:47:39【问题描述】:我的父类中有两个div,其中一个由$(this).parent(\'div\').next(\'.deal-rolldown\').show();找到,另一个$(this).parent(\'div\').next(\'.client-rolldown\').sh... 查看详情

使用测试类而不是通常使用的类来测试 C++ 程序

】使用测试类而不是通常使用的类来测试C++程序【英文标题】:TestingC++programwithTestingclassesovernormallyusedclasses【发布时间】:2010-04-0711:57:35【问题描述】:这可能是一个无意义的问题,但我会尽力而为。我有一个简单的c++程序,... 查看详情

如何使用来自目标c的同名类而不是swift

】如何使用来自目标c的同名类而不是swift【英文标题】:Howtouseclasswithsamenamefromobjectivecinsteadofswift【发布时间】:2015-11-1911:18:27【问题描述】:不幸的是,我在ObjectiveC中定义了一个类(Class.h,Class.m)和另一个在Swift中同名的类... 查看详情

c++中啥是多态!

...以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(注意:重载和多态无关)。 参考技术B多态指同一个实体... 查看详情

使用抽象类而不是特征有啥好处?

】使用抽象类而不是特征有啥好处?【英文标题】:Whatistheadvantageofusingabstractclassesinsteadoftraits?使用抽象类而不是特征有什么好处?【发布时间】:2010-12-3118:05:22【问题描述】:使用抽象类而不是特征有什么好处(除了性能)?... 查看详情

减小我的 NVARCHAR 列的大小是不是有好处

】减小我的NVARCHAR列的大小是不是有好处【英文标题】:IsthereabenefittodecreasingthesizeofmyNVARCHARcolumns减小我的NVARCHAR列的大小是否有好处【发布时间】:2015-08-1821:19:42【问题描述】:我有一个存储数百万行的SQLServer2008数据库。有几... 查看详情

什么是多态?

...针赋值给父类类型的指针。多态性在ObjectPascal和C++中都是通过虚函数实现的。拓展资料:多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是... 查看详情

为啥 KMeans 是一个类而不是 sklearn 中定义的函数?

...:49:24【问题描述】:从开发者的角度来看,他们为什么要使用一个类来设计KMeans,然后让人们去初始化它并这样使用它:fromsklearn.clusteri 查看详情