当前位置: 首页 > news >正文

Java 利用枚举实现单例模式

引言

单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。


Java枚举

基本用法

枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。
首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:

enum Type{
    A,B,C,D;
}

 

创建enum时,编译器会自动为我们生成一个继承自java.lang.Enum的类,我们上面的enum可以简单看作:

class Type extends Enum{ public static final Type A; public static final Type B; ... }

 

对于上面的例子,我们可以把Type看作一个类,而把A,B,C,D看作类的Type的实例。
当然,这个构建实例的过程不是我们做的,一个enum的构造方法限制是private的,也就是不允许我们调用。

“类”方法和“实例”方法

上面说到,我们可以把Type看作一个类,而把A,B。。。看作Type的一个实例。同样,在enum中,我们可以定义类和实例的变量以及方法。看下面的代码:

enum Type{
    A,B,C,D;

    static int value;
    public static int getValue() { return value; } String type; public String getType() { return type; } } 在原有的基础上,添加了类方法和实例方法。我们把Type看做一个类,那么enum中静态的域和方法,都可以视作类方法。和我们调用普通的静态方法一样,这里调用类方法也是通过 Type.getValue()即可调用,访问类属性也是通过Type.value即可访问。 下面的是实例方法,也就是每个实例才能调用的方法。那么实例是什么呢?没错,就是A,B,C,D。所以我们调用实例方法,也就通过 Type.A.getType()来调用就可以了。 最后,对于某个实例而言,还可以实现自己的实例方法。再看下下面的代码: 

 

enum Type{
A{
    public String getType() {
        return "I will not tell you";
    }
},B,C,D;
static int value;

public static int getValue() {
    return value;
}

String type;
public String getType() {
    return type;
 }
}

这里,A实例后面的{…}就是属于A的实例方法,可以通过覆盖原本的方法,实现属于自己的定制。
除此之外,我们还可以添加抽象方法在enum中,强制ABCD都实现各自的处理逻辑:

enum Type{
    A{
        public String getType() {
            return "A"; } },B { @Override public String getType() { return "B"; } },C { @Override public String getType() { return "C"; } },D { @Override public String getType() { return "D"; } }; public abstract String getType(); }

 

枚举单例

有了上面的基础,我们可以来看一下枚举单例的实现方法:


public enum SomeThing {
    INSTANCE;
   
   public String get(){
return "SomeThing";
} }


main(){
SomeThing someThing=SomeThing.INSTANCE;
someThing.get();
}

 

上面的类Resource是我们要应用单例模式的资源,具体可以表现为网络连接,数据库连接,线程池等等。
获取资源的方式很简单,只要 SomeThing.INSTANCE.getInstance() 即可获得所要实例。下面我们来看看单例是如何被保证的:
首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。
也就是说,因为enum中的实例被保证只会被实例化一次,所以我们的INSTANCE也被保证实例化一次。
可以看到,枚举实现单例还是比较简单的,除此之外我们再来看一下Enum这个类的声明:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable

 

可以看到,枚举也提供了序列化机制。某些情况,比如我们要通过网络传输一个数据库连接的句柄,会提供很多帮助。
最后借用 《Effective Java》一书中的话,

单元素的枚举类型已经成为实现Singleton的最佳方法。

相关文章:

  • Bzoj3611 [Heoi2014]大工程
  • HashMap的简单实现
  • 【后缀自动机】hihocoder1441 后缀自动机一·基本概念
  • kafka之zk搭建
  • 机器学习 —— 基础整理(一)贝叶斯决策论;二次判别函数;贝叶斯错误率;生成式模型的参数方法...
  • C# Int转Enum
  • 开启TDE的RDS SQL Server还原到本地环境
  • 如何使用thinkphp的model来验证前端表单?
  • 磁盘文件系统2
  • 201521123009 《Java程序设计》第6周学习总结
  • Java深入 - 深入理解Java集合
  • [转] CSSOM视图模式(CSSOM View Module)相关整理
  • 批处理数字前加0
  • MySQL innodb_table_stats表不存在的解决方法
  • 鬼谷子的局 有感
  • 30天自制操作系统-2
  • go append函数以及写入
  • idea + plantuml 画流程图
  • java8 Stream Pipelines 浅析
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • React组件设计模式(一)
  • Redux系列x:源码分析
  • Vim 折腾记
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue全家桶实现一个Web App
  • 浮现式设计
  • 前端临床手札——文件上传
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 项目实战-Api的解决方案
  • 译自由幺半群
  • HanLP分词命名实体提取详解
  • 数据库巡检项
  • ​iOS安全加固方法及实现
  • ​低代码平台的核心价值与优势
  • #Linux(权限管理)
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $refs 、$nextTic、动态组件、name的使用
  • (1)SpringCloud 整合Python
  • (Oracle)SQL优化技巧(一):分页查询
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)基于IDEA的JAVA基础12
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .bashrc在哪里,alias妙用
  • .NET正则基础之——正则委托
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ 第一章] JavaScript 简史
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [<MySQL优化总结>]
  • [AutoSar NVM] 存储架构