zoukankan      html  css  js  c++  java
  • 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");
        }
    }
  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/frankyou/p/9394871.html
Copyright © 2011-2022 走看看