1 枚举的基本用法

枚举可以有成员方法成员属性构造方法。定义一个枚举:

1
2
3
enum eType{
A,B,C,D;//成员属性
}

创建枚举时,$JVM$会自动创建一个继承自java.lang.Enum的类,上面的enum可以看做如下:

1
2
3
4
enum eType extends Enum{
public static final eType A;
...
}

对于上面的枚举,可以看做是一个类,类名是eType,其中A、B、C、D可以看做eType的四个实例。但是该实例不需要手动创建,且枚举的构造方法时私有的,所有我们也不能够调用,只能有$JVM$进行调用。

由于A、B、C、D可以看做eType的四个实例,所以可以在enum中定义实例的变量和方法:

1
2
3
4
5
6
7
8
9
10
11
enum eType{
A,B,C,D; //成员属性
static int value; //静态变量
public static int getValue() { //静态方法
return value;
}
String type; //非静态变量
public String getType() { //非静态方法
return type;
}
}

在原有的基础上,由于enum可以看做一个类,所以调用也是和普通的类一样,比如:

  • 调用静态属性:eType.value,调用静态方法:eType.getValue()
  • 调用非静态资源:eType.A.getType()

对于枚举当中的某个实例,同样也可以为其编写自己的实例方法,比如:

1
2
3
4
5
6
7
enum eType{
A{
public String getName() {
return "我是枚举类的实例A的实例方法";
}
},B,C,D; //成员属性
}

A后面的大括号里面的代码便是实例A的实例方法,可以通过覆盖原有的方法进行重写。同样也可以在枚举声明抽象方法,强制所有枚举中的实例实现该方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum eType{
A {
@Override
public String getType() {
return "Type A";
}
},B {
@Override
public String getType() {
return "Type B";
}
};
public abstract String getType();
}

2 枚举单例实现

1
2
3
4
5
6
7
8
9
10
11
12
13
class Resource{
//这是资源类,也就是需要实现单例模式的资源类,一般需要实现单例模式比如数据库连接,网络连接等
}
public enum Something {
INSTANCE; //单例实例
private Resource instance;
Something() {
instance = new Resource();
}
public Resource getInstance() {
return instance;
}
}

如果想得到单例实例可以直接使用代码Something.INSTACE.getInstance()进行调用。解释:枚举中确保构造方法是私有的,在访问枚举实例时会执行构造方法,且每个枚举的实例都是static final类型,也就是说该实例在$JVM$中只会被创建一次,在调用构造方法时,我们需要的单例被实例化,在枚举中的实例被保证只会被创建一次,所以我们的单例也会被保证只会创建一次。

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号