Java 利用枚举实现单例模式
来源:互联网 发布:网络收音机mac版 编辑:程序博客网 时间:2024/05/16 10:16
1.引言
单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。
2.Java枚举
2.1 基本用法
枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。
首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:
首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:
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的,也就是不允许我们调用。
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; }}
首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。
也就是说,因为enum中的实例被保证只会被实例化一次,所以我们的INSTANCE也被保证实例化一次。
可以看到,枚举实现单例还是比较简单的,除此之外我们再来看一下Enum这个类的声明:
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable可以看到,枚举也提供了序列化机制。某些情况,比如我们要通过网络传输一个数据库连接的句柄,会提供很多帮助。
最后借用 《Effective Java》一书中的话,
单元素的枚举类型已经成为实现Singleton的最佳方法。
阅读全文
0 0
- Java 利用枚举实现单例模式
- Java 利用枚举实现单例模式
- Java 利用枚举实现单例模式
- Java 利用枚举实现单例模式
- Java枚举实现单例模式
- java中枚举实现单例模式
- Java枚举实现单例模式
- Java枚举实现单例模式
- Java枚举使用以及枚举实现单例模式
- Java枚举enum以及应用:枚举实现单例模式
- Java枚举enum以及应用:枚举实现单例模式
- JAVA枚举单例模式
- 单例模式实现:枚举单例
- java中用枚举类实现单例模式
- 为什么java中用枚举实现单例模式会更好
- Java 枚举实现单例
- 单例模式(枚举实现)
- 枚举实现的单例模式
- Hadoop-No.12之数据采集的时效性
- bzoj
- 关于寻路算法的一些思考(9):寻路者的移动成本
- Linux 下源码编译相关知识
- JVM--运行时数据区以及对象的创建,内存布局、访问
- Java 利用枚举实现单例模式
- 修行之路开始--内存
- 【精】leetcode
- 数据挖掘基本知识
- Redis配置
- hdu6083 2017"百度之星"资格赛1004 度度熊的午饭时光(背包dp+记录路径)
- HDU6058A Kanade's sum
- 第一章 泄露天机的人,易遭天遣,打听人机的人 易遭人怨。
- LeetCode 454. 4Sum II--在四个等长的数组中,找到有多少个四元组的数值之和为0(每个数组中各占一个元素)
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
巴塞罗那大学
巴塞罗那高迪公园
巴塞罗那教堂
巴塞罗那赛程
巴塞罗那机场
巴塞罗那奥运会
恒信巴塞小镇
巴塞罗那有哪些大学
巴塞罗那球衣图片
去巴塞罗那旅游多少钱
西班牙巴塞罗那旅游
巴塞罗那动物园
旅游巴塞罗那
巴塞罗那住宿
巴士管家
模拟巴士
综艺巴士
现金巴士app
巴士模拟
迪巴士
看巴士手机
双层巴士
看84巴士
kan巴士
电玩巴士ps4
巴士在线
巴士论坛
看巴士网
口袋巴士
巴士图片
大巴士
巴士驾驶
北京巴士
巴士租赁
巴士德
长途巴士
租小巴士
水上巴士
巴士下载
考斯特巴士
巴士汽车