当前位置: 首页 > 面试题库 >

为什么在Guava 10中不推荐使用softKeys()?

农永宁
2023-03-14
问题内容

从Guava
10开始,MapMaker.softKeys已弃用,并且中没有对应的方法CacheBuilder

为什么要进行此更改?我需要与使用它的现有代码做什么?


问题答案:

我写这个问题的原因是,起初,我确实确实想知道为什么要这么做(因为我已有使用过的代码softKeys)。但是,反思的原因很明显,因此我决定将其发布在这里,以防其他人也使用softKeys并想知道同一件事。

简而言之,原因是softKeys从一开始就没有任何意义。因此,最初包含它本身就是一个错误,Guava开发人员正在通过弃用纠正此错误。

通常,如果要在所有强引用都消失之后让对象停留一会儿,则可以使用软引用。相反,在使用弱引用时,通常在没有强引用或软引用的情况下立即收集对象。这对于您要暂时保留的缓存
很有用,因此使用相应键进行的查找将“恢复”该值的强引用。

但是,此行为对键没有任何意义:

  • 由于softKeysweakKeys映射使用基于身份的查找,因此获取感兴趣条目的唯一方法是对其键进行强引用。†因此,一旦没有强大的键引用剩余,则该条目实际上将无效(无法恢复)。
  • 之间的唯一区别softKeys,并weakKeys为一个条目保留在地图上所有关键的强引用了多久都没有了。由于这样的条目无论如何都是死的,因此使用softKeys而不是weakKeys仅仅延迟条目的逐出是没有充分理由的。

因此,大多数情况下,遇到使用的代码时,softKeys更合适的替代方法是weakKeys

†我没有考虑通过迭代或除基于键的查找以外的其他方法获取条目的情况,因为映射主要是基于键的操作。



 类似资料:
  • 问题内容: 众所周知,Java 中的接口已损坏。造成这种情况的原因很多,我将不再赘述。其他人已经做到了。这也是Java架构师本身的立场。 因此,我的问题是:为什么还不被弃用?如果核心Java团队已确定它已损坏,那么他们还必须考虑过时。他们反对这样做的原因是什么(在Java 8中仍不建议弃用)? 问题答案: 有一个错误在1997年提交给Java的错误数据库有关添加方法,所以将不再是无用的。它以“无法

  • 问题内容: 我曾经在hibernate 3中使用getHibernateTemplate(),现在我转向了Hibernate 4,在这里我找不到以下类: 在这里我已经阅读过有关它的更多信息,不建议使用 http://forum.springsource.org/showthread.php?117227-Missing-Hibernate- Classes-Interfaces-in-spring

  • 问题内容: 我正在将hibernate项目配置为使用第二级缓存提供程序,以便可以利用查询缓存。 我向ehcache添加了一个依赖项: 我认为我要使用的提供程序类是: 在eclipse中查看引用的库时,我在和上都看到了注释。是什么赋予了?我可以使用最新的替代供应商吗? 我正在使用hibernate版本3.4.0.GA,以防万一。 问题答案: 是什么赋予了?我可以使用最新的替代供应商吗? 不推荐使用它

  • 问题内容: 我曾经在hibernate 3中使用getHibernateTemplate(),现在我转向了Hibernate 4,在这里我找不到以下类: 有人可以解释我为什么吗?在hibernate4中,我现在需要执行所有任务,例如提交,关闭,刷新由getHibernateTemplate()方法自动管理的事务? 问题答案: 因为它的主要目的是使Hibernate会话绑定到当前的Spring事务(

  • 问题内容: HTML从早期开始就有框架,但是在最新版本中已弃用。许多浏览器(我曾尝试使用Internet Explorer)甚至无法正确显示框架。 为什么要这样做?镜框的缺点是什么? 问题答案: 雅各布·尼尔森(JakobNielsen)在1996年的专栏批评镜框。一些关键点: 框架会阻止用户正确标记页面。加载带有书签的框架集页面时,用户先前在框架内单击鼠标没有关系。仅保存外部URL,用户必须导航

  • 问题内容: 我只是想知道为什么现在认为mime_content_type()已被弃用。 这种确定mime类型的方法比替换Fileinfo功能要容易得多。 问题答案: 我猜这是因为Fileinfo可以返回有关files的更多信息。 编辑:这是一个替代黑客: