相信大部分Java开发者在工作中都用到过单例模式(即便这个设计模式并不是一个让人称道的模式),对于饿汉式的编写还好,双检锁懒汉式的编写就比较繁琐了,比如:

class SingletonDemo {private SingletonDemo() {}private static volatile SingletonDemo instance;public static SingletonDemo getInstance() {if (instance == null) {synchronized (SingletonDemo.class) {if (instance == null) {instance = new SingletonDemo();}}}return instance;}
}

虽然这段代码比较短,但如果项目中用的比较多的时候,多次编写一样的代码也是一件很郁闷的事,而且多次编写只会增加出错的可能。下面就提供一种非常简单的方法来简化这个代码。

因为单例模式要求私有的instance静态成员只被初始化一次,这恰好符合惰性求值的特点,所以我们可以利用Lazy(实现代码见最下方)来完成这一点。先来看修改后的情况:

class SingletonDemo {private SingletonDemo() {}private static final Lazy<SingletonDemo> instance = Lazy.from(SingletonDemo::new);public static SingletonDemo getInstance() {return instance.get();}
}

这样一来,就不需要每次编写双检锁和if判断了,代码看上去和饿汉式差不多。(毕竟懒汉式和饿汉式差的就是lazy嘛)

下面是Lazy类的实现:

import java.util.function.Supplier;public class Lazy<T> implements Supplier<T> {private final Supplier<T> supplier;private T value;private volatile boolean isEvaluated = false;public static <T> Lazy<T> from(Supplier<T> supplier) {return new Lazy<>(supplier);}public static <T> Lazy<T> lazy(Supplier<T> supplier) {return from(supplier);}private Lazy(Supplier<T> supplier) {this.supplier = supplier;}@Overridepublic T get() {if (!isEvaluated) {synchronized (this) {if (!isEvaluated) {value = supplier.get();isEvaluated = true;}}}return value;}
}

利用Lazy简化单例模式的编写相关推荐

  1. 利用Helm简化Kubernetes应用部署(2)

    目录 定义Charts  使用Helm部署Demo  Helm常用操作命令  定义Charts 回到之前的"charts"目录,我们依次进行解读并进行简单的修改. Chart.ya ...

  2. 利用Helm简化Kubernetes应用部署(1)

    目录 利用Helm简化Kubernetes应用部署  Helm基础  安装Helm  使用Visual Studio 2019为Helm编写一个简单的应用  利用Helm简化Kubernetes应用部 ...

  3. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition):提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生物 ...

  4. 机器学习实战(十四)利用SVD简化数据

    第十四章 利用SVD简化数据 14.1 SVD的应用 14.1.1 隐形语义索引 14.1.2 推荐系统 14.2 矩阵分解(SVD矩阵分解) 14.3 利用python实现SVD 14.4 基于协同 ...

  5. 用java写注册表单_利用HTML表单标签编写一个注册页面

    今天我们来写一个注册页面 form表单 先来利用表单标签制作一个简单的注册页面,给大家说说标签的结构: 页面结构大体就是这样子的~ 利用HTML表单标签编写一个注册页面 表单标签: 所有需要提交到服务 ...

  6. linux 单例模式改密码,Java 利用枚举实现单例模式

    引言 单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法. Java枚举 基本用法 枚举的用法比较多,本文主要旨在介绍利用枚 ...

  7. 利用操作系统提供的API编写防火墙

    利用操作系统提供的API编写防火墙 /* 利用操作系统提供的API编写防火墙. 该程序涉及到的API说明请访问微软的MSDN Library 代码在C++ Builder 5编译通过 如果您想和我交流 ...

  8. SVDchapter14 机器学习之利用SVD简化数据

    餐馆可划分为很多类别,比如美式.中式.日式.牛排馆.素食店,等等.你是否想过这些 类别够用吗?或许人们喜欢这些的混合类别,或者类似中式素食店那样的子类别.如何才能知道 到底有多少类餐馆呢?我们也许可以 ...

  9. 利用PROGISP实现ARDUINO IDE编写的程序的下载以及如何把AVR单片机做成ARDUINO板

    首先讲讲题目的由来吧.我做的东西原本是利用ARDUINO MEGA2560及各种模块搭建起来的,程序自然也是用ARDUINO IDE写的.但这种东拼西凑的产品自然不够好,更主要的是,之前ARDUINO ...

最新文章

  1. 连接状态_TCP 连接状态及相关命令学习
  2. 基于相机和低分辨率激光雷达的三维车辆检测
  3. 英特尔的指令集体系结构_对标英特尔的RISC-V大有可为,CPU三分天下格局可期
  4. php获得前一天,php 获取前一天、后一天等日期的方法
  5. Quarkus 0.12.0 发布,下一代 K8s 原生 Java 框架
  6. [PHP] 项目实践中使用的IOC容器思想
  7. 电子计算机什么理论,电子计算机的工作原理是什么?
  8. Go语言实时GC - 三色标记算法
  9. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
  10. 机器学习降维-深度AI科普团队
  11. 这个容器逃逸 exploit 获得首届年度谷歌云平台大奖10万美元
  12. NYOJ-57 6174问题
  13. 关于回复某个评论的功能小改进
  14. 有关linux的GPG签名验证错误的解决方法。
  15. 如何将逐小时数据处理为逐日数据
  16. win10硬盘锁怎么解除_win10系统下bitlocker给硬盘加密后怎么解锁
  17. hdu 1680 Cheesy Chess
  18. The method setOnClickListener(View.OnClickListener) in the type View is not applicable for the argu
  19. c/c++静态库和动态库制作
  20. import 与 import()

热门文章

  1. android vitamio框架,利用Vitamio框架来做自己的视频播放器
  2. 教师资格证报名-ie浏览器-不兼容
  3. 中兴冲破“阈值”,家庭监控市场或将重新排位
  4. mSystems | 中科院微生物所东秀珠组发现细菌和古菌协同代谢甜菜碱产甲烷
  5. GK_Zone与GK_CM的区别
  6. 110 李俊民 新庵
  7. 突破中国品牌创新技术实力,TCL做对了什么?
  8. Linux Centos7:11.给系统增加一块硬盘
  9. 静态成员和非静态成员的区别
  10. format格式化工具使用