利用Guava的Suppliers.memoize实现单例

本文主要介绍如何利用Guava的Suppliers.memoize实现单例。

实例

/*** 利用Suppliers.memoize实现单例* Created by xixicat on 15/12/25.*/
public class SuppilerSingletonTest {class HeavyObject{public HeavyObject() {System.out.println("being created");}}class ObjectSuppiler implements Supplier<HeavyObject>{@Overridepublic HeavyObject get() {return new HeavyObject();}}/*** 每次都new一次*/@Testpublic void testNotSingleton(){Supplier<HeavyObject> notCached = new ObjectSuppiler();for(int i=0;i<5;i++){notCached.get();}}/*** 单例*/@Testpublic void testSingleton(){Supplier<HeavyObject> notCached = new ObjectSuppiler();Supplier<HeavyObject> cachedSupplier = Suppliers.memoize(notCached);for(int i=0;i<5;i++){cachedSupplier.get();}}
}

Suppliers.memoize方法

/*** Returns a supplier which caches the instance retrieved during the first* call to {@code get()} and returns that value on subsequent calls to* {@code get()}. See:* <a href="http://en.wikipedia.org/wiki/Memoization">memoization</a>** <p>The returned supplier is thread-safe. The supplier's serialized form* does not contain the cached value, which will be recalculated when {@code* get()} is called on the reserialized instance.** <p>If {@code delegate} is an instance created by an earlier call to {@code* memoize}, it is returned directly.*/public static <T> Supplier<T> memoize(Supplier<T> delegate) {return (delegate instanceof MemoizingSupplier)? delegate: new MemoizingSupplier<T>(Preconditions.checkNotNull(delegate));}@VisibleForTestingstatic class MemoizingSupplier<T> implements Supplier<T>, Serializable {final Supplier<T> delegate;transient volatile boolean initialized;// "value" does not need to be volatile; visibility piggy-backs// on volatile read of "initialized".transient T value;MemoizingSupplier(Supplier<T> delegate) {this.delegate = delegate;}@Override public T get() {// A 2-field variant of Double Checked Locking.if (!initialized) {synchronized (this) {if (!initialized) {T t = delegate.get();value = t;initialized = true;return t;}}}return value;}@Override public String toString() {return "Suppliers.memoize(" + delegate + ")";}private static final long serialVersionUID = 0;}

参考

  • Guava Explained

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之水平ProgressBar多彩背景颜色

ProgressBar多彩的背景颜色 不废话,先爆照,如下图。 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_wi…

冰箱堪比「垃圾桶」?这根棒除味又保鲜,更能 99% 超强杀菌!

{}▲ 点击查看每天的饭菜、生鲜、零食、饮料、干货&#xff0c;总能把我家冰箱塞得满满当当。各种饭菜干货窜味儿&#xff0c;蔬果开始发烂发臭&#xff0c;每天打开冰箱都是一次「开门杀」……用柚子皮和竹炭包除味根本不行&#xff0c;从根源上改善冰箱环境才是硬道理。跟市面…

mac apache2 php,Mac OSX 之 PHP开发环境Apache2配置

time : 2018-03-23author : HGD_IS 李亮星一.事件因果一个星期前&#xff1a;不想下载XAMMP或者MAMP之类的IDE&#xff0c;而且下载完谷歌服务器一直只有放弃按钮&#xff0c;在Finder中打开也是不可打开文件状态&#xff0c;谷歌浏览器给出的解释是该App可能损害我的电脑&…

了解SQL Server触发器及触发器中的事务

引述 首先&#xff0c;写这篇文章的目的是望能把我对触发器的理解&#xff0c;分享出来与大家一起学习。如果你对触发器和事务的概念有些了解&#xff0c;这篇文章对你来说会是很简单&#xff0c;或能让你更进一步的了解触发器里面的一些故事&#xff0c;以及触发器中事务的故…

Android之Android studio如何解决Multiple dex files define Landroid/support/a(文件重复引用错误)

先爆错误的图片照,如下 define 可以理解文件重复的意思,所以这个错误是我导入了v4.jar包的原因,因为我项目里面本来就有v7.jar,如下图 解决办法一: 既然重复了,我就把这个v4.jar包删除掉,我删了之后就可以了,这个方法的前提是我知道哪个包重复了,不然我也不知道删除…

winform进度条实现

最近要给一个 Winform 项目添加功能&#xff0c;需要一个能显示进度条的弹窗&#xff0c;还要求能够中止任务&#xff0c;所以就做了一个&#xff0c;在此做个记录总结。虽然用的是比较老的 Winform 技术&#xff0c;不过其中的原理都是相通的。loading随处可见&#xff0c;比如…

keil之编辑环境配置

1.edit-->configuration 2. 3.开始是&#xff1a;ANSI编码&#xff0c;但一去掉&#xff1a;display modules&#xff0c;中文的注视就乱码了&#xff1b;请教Justchen&#xff0c;把编码改为GB2312&#xff0c;一切恢复正常&#xff1b;转载于:https://www.cnblogs.com/itl…

邮件服务器在企业网中的应用

简介&#xff1a; 电子邮件是因特网上最为流行的应用之一。如同邮递员分发投递传统邮件一样&#xff0c;电子邮件也是异步的&#xff0c;也就是说人们是在方便的时候发送和阅读邮件的&#xff0c;无须预先与别人协同。与传统邮件不同的是&#xff0c;电子邮件既迅速&#xff0c…

适配Win11!Edge重磅更新来袭

夜聊近日&#xff0c;微软对 Microsoft Edge 浏览器进行了两次重大更新。Microsoft Edge 95 正式版主要更新内容&#xff1a;版本号&#xff1a;95.0.1020.301.Microsoft Edge 右键菜单现已适配 Windows 11 风格&#xff0c;采用 Acrylic 和圆角设计&#xff0c;更加美观。2.你…

被清华免试录取的围棋天才,横扫60位围棋大师的最强AI,竟然都输给了高中生!?...

全世界只有3.14 % 的人关注了爆炸吧知识术业有专攻前不久&#xff0c;漫改剧《棋魂》的热播&#xff0c;让围棋狠狠火了一把。图片来源于豆瓣火到什么程度&#xff1f;有网友看完直接就打开了B站的围棋教程。但大部分网友&#xff0c;学不到几天就弃坑了&#xff0c;理由是&…

Android之如何解决Listview里面的值出现了2次

Listview里面的值出现了2次 不废话,先爆照 我去,这个listview里面的值怎么出现了2次,一直在找原因,后来解决了,先看下我的部分代码吧。 这是mainactivity.xml内容 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools=…

C# 10 新特性 —— 插值字符串优化

C# 10 新特性 —— 插值字符串优化Intro字符串应该是我们平时使用的最多的一个类型&#xff0c;从 C# 6 开始我们开始支持了插值字符串&#xff0c;使得我们可以更方便的进行字符串的操作&#xff0c;现在很多分析器也推荐我们使用插值这种写法&#xff0c;这能够使得我们的代码…

电影院为何有散落的青瓜?

1 摄像头&#xff1a;你套个袋子我就认不出来了吗&#xff1f;▼2 路边惊现大熊猫&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 好一个驼小姐&#xff08;via.豆瓣社死小组满杯草莓&#xff09;▼4 学弟的理解也不是无迹可寻▼5 台湾人过生日的方…

Ecshop:后台添加新功能栏目以及管理权限设置

一、添加菜单项打开 /admin/includes/inc_menu.php文件(后台框架左边菜单)&#xff0c;在最后添加一行如下&#xff1a;1$modules[17_other_menu][sns_list] sns_list.php?actlist;ecshop默认一级菜单项有16项&#xff0c;所里这里的例子从17开始。当然这个key可以随便取的&a…

年轻人不讲武德有多可怕?

1 孩子&#xff0c;走你&#xff01;▼2 这都是什么阴间燃料&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 年轻人不讲武德&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 当你偷瞄喜欢的男生▼5 贝多芬&#xff1a;我入土这么都多年了&#xff08;…

使用C#体验函数式编程之——Partial application(局部应用)

函数式编程函数式编程是一种编程范式&#xff0c;着力于避免共享状态、可变数据和副作用产生&#xff0c;函数是第一等公民。这与面向对象编程相反&#xff0c;在面向对象编程中&#xff0c;应用程序状态通常与对象中的方法共享和共存。函数式编程是声明式的而不是命令式的&…

史上最强的烧脑合集!能全都搞懂的只有天才!

▲ 点击查看牛津大学&#xff0c;全球学生削尖脑袋想进的地方。它真正吸引人的&#xff0c;不仅是雄厚的师资、精湛的学术&#xff0c;更因为立校800余年来&#xff0c;始终有一套经典、独门的“高智商训练”方法&#xff01;25位首相、53位总统、11位国王、47位诺贝尔奖得主&a…

github上面如何编辑README

github上面如何编辑README 今天把自己做好的 《手机摇一摇震动刷新(支持ListView、GridView、Webview)》上传到github,之前代码都上传好了,就差介绍了 第一步:找到READM.md文件进入编辑状态 找到了READM.md文件,修改一番以后,我想试下水,先提交看看,如…

开源Winform控件库:花木兰控件库

微信好友推荐&#xff0c;挺好看的Winfrom控件库&#xff0c;下面来看看。花木兰控件库Gitee截图介绍基于 C#&#xff08;语言&#xff09; 4.0 、 VS2019 、 Net Framework 4.0(不包括Net Framework 4.0 Client Profile) 开发的Winform控件库。为了兼容性采用了C#&#xf…

c语言题中的一些陷阱

1、求下列两个数组的长度关系characX[] "abcdefg";char acY[] { a, b,c, d, e, f, g };解析&#xff1a;对于字符串来说&#xff0c;字符串结尾默认为‘\0’&#xff0c;所以acX[]的长度为8&#xff0c;而第二个数组的大小长度为7&#xff0c;而且因为没有用‘\0’结…