Guava的Supplier实现单例
1、函数式编程;
2、第一次get时才会初始化;
3、可以实现单例或缓存。
package suppliers; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.Iterables; import java.util.ServiceLoader; /**
* @author xfyou
* @date 2018/7/30
*/
public class Test { public static void main(String[] args) {
try {
//shouldInitTheSupplierWrappedObjectWhenGetObject();
shouldInitTheSupplierWrappedObjectForOnlyOneTime();
} catch (Exception e) {
e.printStackTrace();
}
} private static void shouldInitTheSupplierWrappedObjectWhenGetObject() throws Exception {
Supplier<Integer> memoize = Suppliers.memoize(new Supplier<Integer>() {
@Override
public Integer get() {
System.out.println("init supplier wrapped object");
return 1;
}
});
System.out.println("main thread block");
Thread.sleep(2000);
System.out.println(memoize.get());
System.out.println(memoize.get());
} private static void shouldInitTheSupplierWrappedObjectForOnlyOneTime() {
Supplier<Admin> memoize = Suppliers.memoize(new Supplier<Admin>() {
@Override
public Admin get() {
System.out.println("init supplier wrapped object");
ServiceLoader<Admin> loader = ServiceLoader.load(Admin.class);
return Iterables.getFirst(loader, null);
}
});
System.out.println(memoize.get());
System.out.println(memoize.get());
System.out.println(memoize.get());
}
}
package suppliers; /**
* @author xfyou
* @date 2018/7/31
*/
public interface User {
/**
* @param firstName
* @param lastName
*/
void addUser(String firstName, String lastName);
}
package suppliers; import lombok.ToString; import java.util.concurrent.atomic.AtomicReference; /**
* @author xfyou
* @date 2018/7/31
*/
@ToString
public class Admin implements User {
private static final AtomicReference<Admin> INSTANCE = new AtomicReference<>(); public Admin() {
if (!INSTANCE.compareAndSet(null, this)) {
throw new IllegalStateException("This class only can be initialized once");
} else {
System.out.println("Construct");
}
} @Override
public void addUser(String firstName, String lastName) {
System.out.println("Add new user");
}
}
Guava的Supplier实现单例的更多相关文章
- java单例的几种实现方法
java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...
- guava学习--Supplier Suppliers
转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...
- Spring 源码学习 - 单例bean的实例化过程
本文作者:geek,一个聪明好学的同事 1. 简介 开发中我们常用@Commpont,@Service,@Resource等注解或者配置xml去声明一个类,使其成为spring容器中的bean,以下我 ...
- Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...
- java单例设计模式
单例模式的特点: 1.单例类只能有一个对象(实例). 2.单例类必须自己创建自己的唯一实例 . 3.单例类必须给所有其他对象提供这一实例. 设置步骤: 1.将对象的应用成员变量用private来修饰. ...
- DBUtil数据库连接单例 —— 简单不简单
单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...
- SSH中Action的单例与多例
Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- static实现单例的隐患
1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...
随机推荐
- [Web 前端] this作用域问题
如何不用这种写法:理想的写法是this.setState({ .... }) 可能是我没有描述清楚,我不想用这种学法而已,这样多了一个变量,我觉得很不舒服.我尝试了先把 setState 赋值到变量里 ...
- git error: RPC failed; curl 56 GnuTLS recv error 解决方案
// git 报错情况: error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properl ...
- PHP Curl transfer closed with outstanding read data remaining
php transfer closed with outstanding read data remaining php curl CURLOPT_HTTPHEADER php curl 报错 tra ...
- sqlserver 中WITH NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
https://www.cnblogs.com/sthinker/p/5922967.html SqlServer查询语句中用到的锁 作者: wokofo 前段时间**公司DBA来我们这培训.讲了一大 ...
- emouse思·睿—评论与观点整理之一
虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...
- [转]使用HackCube-Special分析胎压传感器信号
胎压无线传感器安全检测 我们团队之前也有用USRP和GNUradio对其他的胎压设备进行的安全检测,我不使用这套环境的原因是软件无线电的设备和笔记本已经算体积不小的一套设备,通常测试环境都在户外,在这 ...
- 查看JVM统计信息【转】
查看JVM统计信息 [myname@name ~]$ jstat -gcutil 17421 Warning: Unresolved Symbol: sun.gc.generation.2.space ...
- SharePoint SPListItem 权限设置
namespace Microsoft.SharePoint { using System; using System.Text; using System.Collections.Generic; ...
- MySQL集群的几种方案
组建MySQL集群的几种方案LVS+Keepalived+MySQL(有脑裂问题?但似乎很多人推荐这个)DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂 ...
- java 使用AXIS调用远程的web service
1.服务 2.代码 import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.ax ...