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实现单例的更多相关文章

  1. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...

  2. guava学习--Supplier Suppliers

    转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...

  3. Spring 源码学习 - 单例bean的实例化过程

    本文作者:geek,一个聪明好学的同事 1. 简介 开发中我们常用@Commpont,@Service,@Resource等注解或者配置xml去声明一个类,使其成为spring容器中的bean,以下我 ...

  4. Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean

    Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...

  5. java单例设计模式

    单例模式的特点: 1.单例类只能有一个对象(实例). 2.单例类必须自己创建自己的唯一实例 . 3.单例类必须给所有其他对象提供这一实例. 设置步骤: 1.将对象的应用成员变量用private来修饰. ...

  6. DBUtil数据库连接单例 —— 简单不简单

    单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...

  7. SSH中Action的单例与多例

    Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. static实现单例的隐患

    1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...

随机推荐

  1. jquery validate验证方法

    实例: equalTo方法 equalTo(其他)返回:布尔 说明:要求元素与另一个元素相同 等于(其他) 其他 类型:选择器 元素的选择器用于比较当前值 例子: 使“字段”必须与#other相同 1 ...

  2. C#多线程读写同一文件处理

    在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”. 多线程访问统一资源的异常, 解决方案1,保证读写操作单线程执行,可以使用lock 解决方案2,使用S ...

  3. 基于图的图像分割(Graph-Based Image Segmentation)

    一.介绍 基于图的图像分割(Graph-Based Image Segmentation),论文<Efficient Graph-Based Image Segmentation>,P. ...

  4. fabric 清理环境 运行SDK

    清理环境: rm -rf /tmp/* rm -rf ~/.hfc-key-store/ 启动网络: docker  ps -a create channel: join channel: 清理npm ...

  5. WebFormViewEngine及用户控件寻址bug

    在做我的网站的时候遇到了主题切换的问题,特总结与大家共享. 熟悉asp.net mvc的朋友都知道,mvc中,默认情况下视图都在views文件夹下放着.要想改变文件必须重写WebFormViewEng ...

  6. IO流 简介 总结 API 案例 MD

    目录 IO 流 简介 关闭流的正确方式 关闭流的封装方法 InputStream 转 String 的方式 转换流 InputStreamReader OutputStreamWriter 测试代码 ...

  7. RxJava【变换】操作符 map flatMap concatMap buffer MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. Android -- 状态栏高度

    干货 Class<?> c = null; Object obj = null; Field field = null; int x = 0, sbar = 0; try { c = Cl ...

  9. Java提高篇(转)

    http://www.cnblogs.com/mfrank/category/1118474.html Day1 抽象类 Day2 接口 Day3 抽象类与接口的比较 Day4 Java中的回调 Da ...

  10. mongoose系列——几行代码实现CRUD

    1. nodejs 确实好用,mongoose封装了mongodb,代码很简洁. const mongoose = require('mongoose'); mongoose.connect(&quo ...