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中静态的域和⽅法,都可以视作类⽅法。和我们调⽤普通的静态⽅法⼀样,这⾥调⽤类⽅法也是通过 Value()即可调⽤,访问类属性也是通过Type.value即可访问。下⾯的是实例⽅法,也就是每个实例才能调⽤的⽅法。那么实例是什么呢?没错,就是A,B,C,D。所以我们调⽤实例⽅法,也就通过 Type()来调⽤就可以了。最后,对于某个实例⽽⾔,还可以实现⾃⼰的实例⽅法。再看下下⾯的代码:
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();
}
枚举单例
有了上⾯的基础,我们可以来看⼀下枚举单例的实现⽅法:
class Resource{
}
public enum SomeThing {
INSTANCE;
private Resource instance;
SomeThing() {
instance = new Resource();
}
public Resource getInstance() {
return instance;
}
}
上⾯的类Resource是我们要应⽤单例模式的资源,具体可以表现为⽹络连接,数据库连接,线程池等等。
获取资源的⽅式很简单,只要 Instance() 即可获得所要实例。下⾯我们来看看单例是如何被保证的:
⾸先,在枚举中我们明确了构造⽅法限制为私有,在我们访问枚举实例时会执⾏构造⽅法,同时每个枚举实例都是static final类型的,也就表明只能被实例化⼀次。在调⽤构造⽅法时,我们的单例被实例化。
也就是说,因为enum中的实例被保证只会被实例化⼀次,所以我们的INSTANCE也被保证实例化⼀次。
可以看到,枚举实现单例还是⽐较简单的,除此之外我们再来看⼀下Enum这个类的声明:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable
可以看到,枚举也提供了序列化机制。某些情况,⽐如我们要通过⽹络传输⼀个数据库连接的句柄,会提供很多帮助。
最后借⽤《Effective Java》⼀书中的话,
单元素的枚举类型已经成为实现Singleton的最佳⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论