java枚举解析以及单例的实现
2018-03-15 16:56
555 查看
转载自:http://blog.csdn.net/yy254117440/article/details/52305175
引言
单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。Java枚举
基本用法
枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:
enum Type{ A,B,C,D; }1
2
3
创建enum时,编译器会自动为我们生成一个继承自java.lang.Enum的类,我们上面的enum可以简单看作:
class Type extends Enum{ public static final Type A; public static final Type B; ... }1
2
3
4
5
对于上面的例子,我们可以把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()来调用就可以了。 最后,对于某个实例而言,还可以实现自己的实例方法。再看下下面的代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这里,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(); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
枚举单例
有了上面的基础,我们可以来看一下枚举单例的实现方法:class Resource{ } public enum SomeThing { INSTANCE; private Resource instance; SomeThing() { instance = new Resource(); } public Resource getInstance() { return instance; } }1
2
3
4
5
6
7
8
9
10
11
12
13
上面的类Resource是我们要应用单例模式的资源,具体可以表现为网络连接,数据库连接,线程池等等。
获取资源的方式很简单,只要 SomeThing.INSTANCE.getInstance() 即可获得所要实例。下面我们来看看单例是如何被保证的:
首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。
也就是说,因为enum中的实例被保证只会被实例化一次,所以我们的INSTANCE也被保证实例化一次。
可以看到,枚举实现单例还是比较简单的,除此之外我们再来看一下Enum这个类的声明:
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable1
2
可以看到,枚举也提供了序列化机制。某些情况,比如我们要通过网络传输一个数据库连接的句柄,会提供很多帮助。
最后借用 《Effective Java》一书中的话, 单元素的枚举类型已经成为实现Singleton的最佳方法。 个人注释:
其实使用枚举实现单例,以下写法不是更简单:
public enm Singleton{ INSTANCE; public void doSomething(){}
}获取单例:Singleton.INSTANCE执行单例方法:Singleton.INSTANCE.doSomethis
相关文章推荐
- Java枚举enum以及应用:枚举实现单例模式
- Java多线程的两种实现方式的区别以及同步问题中的锁对象深刻解析
- 红黑树原理解析以及Java实现
- Java枚举enum以及应用:枚举实现单例模式
- java_security之base64原理解析以及三种代码的实现方式
- java微信开发API解析(四)-自定义菜单以及个性化菜单实现
- java实现Excel文件解析---apache POI以及把汉字转化为拼音
- Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享
- 深度解析Java中volatile的内存语义实现以及运用场景
- Java枚举使用以及枚举实现单例模式
- 关于Socket的解析以及双方即时通讯的java实现方法
- Java枚举enum以及应用:枚举实现单例模式
- 字符串计数-复杂的动态规划题 解析以及Java代码实现
- XML三种解析方式简介以及JAVA实现
- java连接oracle9i以及连接池实现
- 传智播客 Java网络公开课一静态导入枚举以及可变参数
- java实现对url解析
- AspriseOCR破解用Java实现网络图片解析
- 如何用Java 实现 Excel 表达式的解析(摘自:http://topic.csdn.net/t/20030408/17/1634982.html#)
- MSN协议分析以及Java实现MSN登陆