利用Lazy简化单例模式的编写
相信大部分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简化单例模式的编写相关推荐
- 利用Helm简化Kubernetes应用部署(2)
目录 定义Charts 使用Helm部署Demo Helm常用操作命令 定义Charts 回到之前的"charts"目录,我们依次进行解读并进行简单的修改. Chart.ya ...
- 利用Helm简化Kubernetes应用部署(1)
目录 利用Helm简化Kubernetes应用部署 Helm基础 安装Helm 使用Visual Studio 2019为Helm编写一个简单的应用 利用Helm简化Kubernetes应用部 ...
- 【机器学习实战】第14章 利用SVD简化数据
第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition):提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生物 ...
- 机器学习实战(十四)利用SVD简化数据
第十四章 利用SVD简化数据 14.1 SVD的应用 14.1.1 隐形语义索引 14.1.2 推荐系统 14.2 矩阵分解(SVD矩阵分解) 14.3 利用python实现SVD 14.4 基于协同 ...
- 用java写注册表单_利用HTML表单标签编写一个注册页面
今天我们来写一个注册页面 form表单 先来利用表单标签制作一个简单的注册页面,给大家说说标签的结构: 页面结构大体就是这样子的~ 利用HTML表单标签编写一个注册页面 表单标签: 所有需要提交到服务 ...
- linux 单例模式改密码,Java 利用枚举实现单例模式
引言 单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法. Java枚举 基本用法 枚举的用法比较多,本文主要旨在介绍利用枚 ...
- 利用操作系统提供的API编写防火墙
利用操作系统提供的API编写防火墙 /* 利用操作系统提供的API编写防火墙. 该程序涉及到的API说明请访问微软的MSDN Library 代码在C++ Builder 5编译通过 如果您想和我交流 ...
- SVDchapter14 机器学习之利用SVD简化数据
餐馆可划分为很多类别,比如美式.中式.日式.牛排馆.素食店,等等.你是否想过这些 类别够用吗?或许人们喜欢这些的混合类别,或者类似中式素食店那样的子类别.如何才能知道 到底有多少类餐馆呢?我们也许可以 ...
- 利用PROGISP实现ARDUINO IDE编写的程序的下载以及如何把AVR单片机做成ARDUINO板
首先讲讲题目的由来吧.我做的东西原本是利用ARDUINO MEGA2560及各种模块搭建起来的,程序自然也是用ARDUINO IDE写的.但这种东拼西凑的产品自然不够好,更主要的是,之前ARDUINO ...
最新文章
- 连接状态_TCP 连接状态及相关命令学习
- 基于相机和低分辨率激光雷达的三维车辆检测
- 英特尔的指令集体系结构_对标英特尔的RISC-V大有可为,CPU三分天下格局可期
- php获得前一天,php 获取前一天、后一天等日期的方法
- Quarkus 0.12.0 发布,下一代 K8s 原生 Java 框架
- [PHP] 项目实践中使用的IOC容器思想
- 电子计算机什么理论,电子计算机的工作原理是什么?
- Go语言实时GC - 三色标记算法
- 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
- 机器学习降维-深度AI科普团队
- 这个容器逃逸 exploit 获得首届年度谷歌云平台大奖10万美元
- NYOJ-57 6174问题
- 关于回复某个评论的功能小改进
- 有关linux的GPG签名验证错误的解决方法。
- 如何将逐小时数据处理为逐日数据
- win10硬盘锁怎么解除_win10系统下bitlocker给硬盘加密后怎么解锁
- hdu 1680 Cheesy Chess
- The method setOnClickListener(View.OnClickListener) in the type View is not applicable for the argu
- c/c++静态库和动态库制作
- import 与 import()