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. 迷宫问题的C语言求解

    1 .Preface /** * There have been many data to introduce the algorithm. So I will try to simply expla ...

  2. ps -ef | grep 查看进程命令

    通过 ps -ef | grep redis 查看当前Redis 的进程情况.

  3. [Ubuntu] fg、bg让你的进程在前后台之间切换

    refer to  : http://man.linuxde.net/jobs Linux下的fg和bg命令是进程的前后台调度命令,即将指定号码(非进程号)的命令进程放到前台或后台运行.比如一个需要长 ...

  4. 我的Java学习推荐书目

    一直有这么个想法,列一下我个人认为在学习和使用Java过程中可以推荐一读的书籍,给初学者或者想深入的朋友一些建议,帮助成长.推荐的的都是我自己读过,也会推荐一些朋友读过并且口碑不错的书籍. 一.基础类 ...

  5. Latex:多个公式使用同一个编号(右对齐)

    \usepackage{amsmath} \begin{equation}\begin{aligned}equation 1 ... \\equation 2 ... \\equation 3 ... ...

  6. easyui基于web的打印实现 .

    <%@ page language="java"pageEncoding="UTF-8"%> <object id="WebBrow ...

  7. LeetCode 总结

    LeetCode 方法详解

  8. Reverse Words in a String leetcode java

    题目: Given an input string, reverse the string word by word. For example, Given s = "the sky is ...

  9. MYSQL数据删除数据,物理空间没释放

    当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除了表的一大部分数据,或者如果已 ...

  10. vim的查找与替换

    http://harttle.land/2016/08/08/vim-search-in-file.html