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 ...
随机推荐
- 黑马day17 ajax&实现username自己主动刷新
1. regist.jsp文件 <%@ page language="java" pageEncoding="utf-8"%> <!DOCTY ...
- Android源码中final关键字的用法及final,finally,finalize的区别
Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...
- Android 开发:由模块化到组件化(一)
在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...
- Secondary NameNode 的作用
https://blog.csdn.net/xh16319/article/details/31375197 很多人都认为,Secondary NameNode是NameNode的备份,是为了防止Na ...
- 【VC++积累】之八、PreTranslageMessage;TranslageMessage;GetMessage和PeekMessage的区别
先来看windows消息机制: 首先系统(也就是windows)把来自硬件(鼠标,键盘等消息)和来自应用程序的消息 放到一个系统消息队列中去. 而应用程序需要有自己的消息队列,也就是线程消息队列,每一 ...
- Html 列表 li ul使用
html中偶尔会使用到列表,记录一下. <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...
- MultipleRegularExpressionAttribute MVC中扩展自定义验证规则
好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的.这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 ...
- [leetcode]Spiral Matrix II @ Python
原题地址:https://oj.leetcode.com/problems/spiral-matrix-ii/ 题意: Given an integer n, generate a square ma ...
- WCF创建简单程序
1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc,当然你也可以直接 ...
- BUG的严重级别分类 BUG状态标准
英文参考 BUG的严重级别分类 Severity This field describes the impact of a bug. Blocker Blocks development and/or ...