首页 \ 问答 \ 为什么Guava不为小的ImmutableLists使用专门的类?(Why does Guava not use specialized classes for small ImmutableLists?)

为什么Guava不为小的ImmutableLists使用专门的类?(Why does Guava not use specialized classes for small ImmutableLists?)

Guava的ImmutableList有一系列重载of()方法。 正如在这个解决的问题的上下文中所讨论的那样,存在这些以避免在将varargs与泛型混合时发生的警告。

但除此之外,0和1参数方法都依赖于专门的列表实现。 似乎可以对2..11参数方法做同样的事情,从而减少这些列表的内存消耗 - 沿着

final class ImmutableListWith2Elements<E> extends ImmutableList<E> {
  final E e1;
  final E e2;
  ...

相反,它们使用基于数组的实现,这意味着除了内容引用之外,还存储数组对象和对数组的引用。 你能帮我理解这里涉及的权衡吗?


Guava's ImmutableList has a series of overloaded of() methods. As discussed in the context of this solved question, these exist to avoid the warnings that occur when mixing varargs with generics.

But in addition to that, the 0 and 1 parameter methods each rely on a specialized list implementation. It would seem that the same thing could be done for the 2..11 parameter methods, thereby reducing memory consumption of these lists - along the lines of

final class ImmutableListWith2Elements<E> extends ImmutableList<E> {
  final E e1;
  final E e2;
  ...

Instead, they use an array-based implementation, which means storing an array object and a reference to the array in addition to the content references. Can you help me understand the trade-offs involved here?


原文:https://stackoverflow.com/questions/10568440
更新时间:2019-11-15 16:37

最满意答案

你能帮我理解这里涉及的权衡吗?

这是一个权衡:

  • 性能 - 不分配临时数组可以节省成本。 但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。请阅读@Voo提供的这个链接 !)
  • 可读性 - 拥有一堆额外的重载会使javadoc混乱。
  • 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。
  • 实用程序 - 这些重载的使用频率是多少? 我希望答案“很少”。
  • 字节码占用空间 - 这些额外的重载将导致使用Guava JAR文件的每个应用程序的应用程序膨胀。

我的建议:

  • 不要对Guava开发人员提出这个问题。 他们已经决定了权衡取舍。 你只是在浪费你的气息。
  • 如果缺少这些类或方法会损害您的应用程序,请自行添加。 (但尝试以不涉及番石榴的私人“叉子”的方式来做这件事......因为从长远来看,你可能会后悔。)

为了记录,我认为Guava开发人员做对了。


Can you help me understand the trade-offs involved here?

It is a tradeoff between:

  • Performance - there is a saving from not allocating the temporary array. However, one would need to do some extensive code analysis and benchmarking to quantify that saving. (I suspect that in most applications it would be insignificant. And read this link contributed by @Voo!)
  • Readability - having a bunch of the extra overloads clutters up the javadocs.
  • Maintainability - having a bunch of overloads that are implemented iun such a way that the temporary object is not required would entail a lot of copy/paste programming, and this makes future code maintenance harder.
  • Utility - how often would these overloads be used? I expect that the answer would be "rarely".
  • Bytecode footprint - these extra overloads would contribute to application bloat for every application using the Guava JAR file.

My advice:

  • Don't bug the Guava developers about this. They've already made up their minds about the tradeoffs. You'll just be wasting your breath.
  • If the lack of these classes or methods hurts your application, roll your own additions. (But try to do it in a way that doesn't involve a private "fork" of Guava ... because you'll probably regret that in the long term.)

For the record, I think that the Guava developers got this right.

2012-05-13

相关问答

更多

为什么Guava不为小的ImmutableLists使用专门的类?(Why does Guava not use specialized classes for small ImmutableLists?)

你能帮我理解这里涉及的权衡吗? 这是一个权衡: 性能 - 不分配临时数组可以节省成本。 但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。请阅读@Voo提供的这个链接 !) 可读性 - 拥有一堆额外的重载会使javadoc混乱。 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。 实用程序 - 这些重载的使用频率是多少? 我希望答案“很少”。 字节码占用空间 - 这些额外的重载 ...

JS中的专业LinkedLists(Specialized LinkedLists in JS)

库集合 js包含一个列表实现,该列表实现“由具有头节点的双向链表支持”。 var list = new List([1, 2, 3]); list.splice(1, 1, 6, 5); alert(list.toArray()); // [1,6,5,3] <script src="https://rawgit.com/montagejs/collections/master/collections.min.js" type="text/javascript"></script> The ...

如何在guava-libraries项目上运行“mvn compile”后解决错误?(How to resolve the errors after running “mvn compile” on guava-libraries project?)

你遇到了maven-dependency-plugin的bug MDEP-98 ,它是在构建guava-gwt时执行的。 不幸的是,没有解决方案可以解决这个bug,除了不使用mvn compile而是使用mvn package或mvn install 。 You ran into the bug MDEP-98 of the maven-dependency-plugin, which is executed during the build of guava-gwt. Unfortunately ...

将Guava的库添加到NetBeans(Adding Guava's library to NetBeans)

在Javadoc中提到的10.0中添加了Stopwatch :寻找@since / Since。 Stopwatch was added in 10.0, as mentionned in the Javadoc: look for the @since/Since.

番石榴的IntervalTree(IntervalTree in Guava)

Guava没有提供这个,尽管你可以通过找到给定点之前和之后的第一个范围来在RangeSet之上构建这样的东西。 但一般来说,除了类型的比较排序之外,Guava Range对距离,度量或任何其他内容一无所知 。 他们不知道10比15更接近11 。 Guava doesn't provide this, though you might be able to build such a thing on top of a RangeSet by finding the first range befor ...

Ceylon模块系统:Guava类不匹配,即使依赖树中只有一个Guava(Ceylon module system: Guava class mismatch even though there's only one Guava in dependencies tree)

好的,我明白了。 问题是RoleConverter转换为ceylon.language.String ,而api期望转换为java.lang.String 。 现在修复它: shared class RoleConverter() extends Converter<Role, JString>() { shared actual Role doBackward(JString? name) { "Cannot convert null to role." ...

Weblogic服务器guava NoSuchMethodError(Weblogic server guava NoSuchMethodError)

Weblogic 12c(12.1.3)在Oracle / Middleware / Oracle_Home / wlserver / modules / com.google.common_1.2.0.0_11-0-2.jar中附带了自己的Guava依赖项 通过告诉WebLogic您更喜欢使用自己的版本,可以避免加载错误库的冲突。 如果是EAR,请将以下内容添加到application.xml : <prefer-application-packages> <package-name>com ...

使用guava AbstractScheduledService(Using guava AbstractScheduledService)

AbstractScheduledServiced实现Service 。 Service接口描述了生命周期方法,包括startAsync 。 ServiceState枚举文字包含有关其含义的文档。 处于NEW状态的服务(刚刚创建): 处于此状态的服务处于非活动状态。 它做的工作量极少,占用资源极少。 要使服务执行某些有用的操作,您必须将其转换为RUNNING状态 此状态下的服务正在运行。 这就是为什么你必须在它做任何事之前启动服务的原因。 我还建议不要从构造函数中调用startAsync,而是从创 ...

不懂Guava PrimitiveSink(Don't understand Guava PrimitiveSink)

在您的第一个片段中,您执行以下操作: final String toHash = id + ts + secret; ts很long ; 但是,在上面的语句中,它将作为字符串附加。 在您的第二个片段中,您执行以下操作: .putLong(ts) 因此,您的输出将有所不同......您应该 .putString(String.valueOf(ts)) 代替。 In your first snippet you do: final String toHash = id + ts + secret ...

无法从Guava解析通用参数TypeToken(Cannot resolve generic parameter TypeToken from Guava)

这就是TypeToken “hack”的工作方式。 它使用Class#getGenericSuperclass() (或getGenericSuperInterface )。 它的javadoc说 如果超类是参数化类型,则返回的Type对象必须准确反映源代码中使用的实际类型参数。 在这种情况下,这就是O public abstract class AbstractMenuOptionBuilder<O extends IClickable> 您将获得源代码中的硬编码。 如果您将Link作为类型参 ...

相关文章

更多

最新问答

更多
  • 如何保护Solr只允许SELECT请求给用户并禁止其他任何东西?(How to secure Solr to allow SELECT request to only users and disallow anything else?)
  • XPath表达式无效/错误TFHpple SWIFT 1.2(XPath Expression not working/incorrect TFHpple SWIFT 1.2)
  • css3 3D变换不能平滑地制作动画(css3 3D transform doesn't animate smoothly)
  • 运行时错误'91'和Outlook.Application = <对象变量或没有设置块变量>?(Run-time error '91' & Outlook.Application = Object variable or With block variable not set?)
  • 慢的webservice问题(Slow webservice problem)
  • textview的不正确对齐方式(Improper alignment of a textview)
  • 在第一步“Hello World”中出现Java错误(Cannot run “Hello World” program in Eclipse)
  • 为什么十六进制地址是14个字符?(why the hex address is 14 character?)
  • 如何在Python中的不同类中使用变量?(How to use variable in different classes in Python?)
  • asp:GridView HYPERLINKFIELD - datanavigateurlformatstring中的asp代码(asp:GridView HYPERLINKFIELD - asp code inside datanavigateurlformatstring)
  • 关于adaboost算法(About adaboost algorithm)
  • 在Matlab上内置图像(Built in Images on Matlab)
  • java swing:输入键事件时焦点丢失(java swing: Focus lost on enter key event)
  • C#中的通用约束,T是相同的TSomethingElse,对吧?(Generic constraints in C#, T is the same TSomethingElse, right?)
  • 从mybatis中的光标获取数据(Fetching data from cursor in mybatis)
  • 在运行时从XML构建对象的最佳方法(Best way for building objects out of XMLs at runtime)
  • 在整个窗口中拉伸sf :: Sprite(Stretch sf::Sprite across entire window)
  • Selenium Node API Web驱动程序等待超时处理程序(Selenium Node API web driver wait timeout handler)
  • 函数使用并且是map的一部分(循环依赖?)(Function uses and is part of map (circular dependency?))
  • 是否可以在C ++ 14中使用可选模板参数创建类型元组?(Is possible to make a tuple of types with optional template parameters in C++14?)
  • PHP从窗帘后面打印/ f(PHP prints /f from behind the curtains)
  • JFrame的contentPane的LayoutManager(LayoutManager of JFrame's contentPane)
  • 用于Instagram Feed的图像滚动(Image Roll Overs for Instagram Feed)
  • 如何显示拉伸字体(双倍宽度/高度)?(How to display stretched font (double width/height)?)
  • 文件操作API在fileapi.h和stdio.h中的WP8差异?(WP8 differences between file manipulation APIs in fileapi.h and stdio.h?)
  • 保存失败后Rails没有回滚事务()(Rails not rolling back transaction after failed save())
  • jqgrid中的分页问题与数组数据(Pagination problem in jqgrid with array data)
  • 重定向时,通过其他页面上的URL调用javascript函数(Call javascript function through url on otherpage while Redirecting)
  • 如何使用InvokeCommandAction调用我的方法并传入参数?(How do I go about using InvokeCommandAction to call a method of mine and pass in parameters?)
  • Jquerymobile按钮仅显示页面的第一个外观(Jquerymobile buttons are shown only first apperance of the page)