博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 利用枚举实现单例模式
阅读量:4300 次
发布时间:2019-05-27

本文共 2408 字,大约阅读时间需要 8 分钟。

1.引言

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

2.Java枚举

2.1 基本用法

枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。 
首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:
enum Type{    A,B,C,D;}
创建enum时,编译器会自动为我们生成一个继承自
.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的,也就是不允许我们调用。

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

上面说到,我们可以把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();}

3.枚举单例

有了上面的基础,我们可以来看一下枚举单例的实现方法:
class Resource{}public enum SomeThing {    INSTANCE;    private Resource instance;    SomeThing() {        instance = new Resource();    }    public Resource getInstance() {        return instance;    }} 
获取资源的方式很简单,只要 SomeThing.INSTANCE.getInstance() 即可获得所要实例。下面我们来看看单例是如何被保证的: 

首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。 

也就是说,因为enum中的实例被保证只会被实例化一次,所以我们的INSTANCE也被保证实例化一次。 

可以看到,枚举实现单例还是比较简单的,除此之外我们再来看一下Enum这个类的声明:
public abstract class Enum
> implements Comparable
, Serializable
可以看到,枚举也提供了序列化机制。某些情况,比如我们要通过网络传输一个数据库连接的句柄,会提供很多帮助。 

最后借用 《Effective Java》一书中的话,
单元素的枚举类型已经成为实现Singleton的最佳方法。

转载地址:http://hzxws.baihongyu.com/

你可能感兴趣的文章
Sqoop往Hive导入数据实战
查看>>
Mysql到HBase的迁移
查看>>
Sqoop import进阶
查看>>
Hive语句是如何转化成MapReduce任务的
查看>>
Hive创建table报错:Permission denied: user=lenovo, access=WRITE, inode="":suh:supergroup:rwxr-xr-x
查看>>
Hive执行job时return code 2排查
查看>>
hive常用函数及数据结构介绍
查看>>
Hive面试题干货(亲自跟着做了好几遍,会了的话对面试大有好处)
查看>>
力扣题解-230. 二叉搜索树中第K小的元素(递归方法,中序遍历解决)
查看>>
力扣题解-123. 买卖股票的最佳时机 III(动态规划)
查看>>
java中ThreadLocal类的使用
查看>>
java中数组长度为零和为空的区别
查看>>
图解eclipse 查看原始类出现The jar file rt.jar has no source attachment
查看>>
JVM堆内存设置原理
查看>>
约瑟夫问题(java实现)
查看>>
Java 中int、String的类型转换
查看>>
java实现9大排序算法
查看>>
一句话总结java23种设计模式
查看>>
静态表查找
查看>>
乐观锁的一种实现方式——CAS
查看>>