JDK1.5以后,Java中多了一个Enum关键字,用来定义枚举类型。而在JDK1.5之前,人们都是手动来创建枚举。
首先,我们要知道什么是枚举?
顾名思义,枚举,就是将所需要的一个一个列出来。在创建枚举类时,我们必须手动指定它包含的所有对象。
那什么情况我们会使用枚举类型呢?
一般的数据,我们都会存储在关系型数据库中;图片多的话,有专门的图片服务器;日志、及时性高的数据,我们会存在NoSQL中;海量的数据,我们会想办法,将数据存在分布式数据库中。
而对于一些有特点的信息,我们无需将它们存储在数据库里面,我们会选择将它们用枚举类来进行表示。诸如数据字典、产品类别常量等等。
这些的特点就是:每个数据项目个数、取值都十分稳定。
枚举类的使用非常简单,下面我们来看枚举类常用的集中用法:
1、最简单的枚举类
public enum Gender {
MALE,FEMALE;
}
上面就是一个关于性别的简单的枚举类,而 `MALE` 和 `MEFMLE` 是Gender枚举类的两个对象实例。这也是枚举类的规定,必须将枚举类的对象实例,列在枚举类里面。我们程序员需要做的就是将实例列出来。
而实际上,JVM会默认每个对象使用public static final 关键字来修饰。也就是说上面的代码等价于:“public static final Gender MALE = new Gender();public static final Gender FEMALE = new Gender();”。
之所以设置为final的,是因为我们不希望枚举类的对象发生改变;使用static修饰,也无可非议,因为我们希望枚举类的对象是类的属性。
我们已经知道,所有属性都是用了final修饰符来修饰,那么我们必须在构造函数中、或者定义时、或者初始化块中指定初始值,但是通常情况下,我们都习惯在构造函数里面为对象赋值。
上面的例子,因为对所属的对象还没有赋值,所以需要完善后,才能使用。我们来看下面的例子:
2、比较常用的枚举类
public enum Gender {
MALE("1","男"),FEMALE("0","女");
private String code;
private String desc;
private Gender(String code,String desc){
this.code = code;
this.desc = desc;
}
public static Gender getEnumByCode(String code){
for (Gender item : Gender.values()) {
if (item.getCode()==code) {
return item;
}
}
return null;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
上面这种用法,大家应该都知道,既然 `MALE` 和 `MEFMLE` 都是对象,那么 `MALE` 和 `MEFMLE`后面的括号应该是构造函数。观察后不难发现,该类中确实存在一个 包含两个参数的Gender的构造函数。
不难发现,上面的例子存在一个问题:我们可以改变枚举类对象的值。原因很简单:尽管枚举类对象被final修饰,但是final关键字对于引用类型来说,只能保证引用地址不变,而对象的属性值是可以变话的。既会下面的情况,下面代码运行结果会是:男。
public static void main(String[] args) {
Gender.MALE.setCode("2");
System.out.println(Gender.getEnumByCode("2").getDesc());;
}
可想而知,这样的枚举在使用是,是不合规矩的,我们最好将枚举类设置成不可变类。所以,我们还需要对这个例子进行改进:
3、最常用的枚举类
最起码,下面这种 是我最个人最喜欢用的一种:
将属性定义成final类型的,说明属性值是不可改变的,然后在构造函数中为对象赋值。这个枚举类变成了一个不可变类,它的属性不应该改变,这样会更加安全,代码更加简洁。
public enum Gender {
MALE("1","男"),FEMALE("0","女");
private final String code;
private final String desc;
private Gender(String code,String desc){
this.code = code;
this.desc = desc;
}
public static Gender getEnumByCode(String code){
for (Gender item : Gender.values()) {
if (item.getCode()==code) {
return item;
}
}
return null;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
除此之外,枚举类还有一些用法,比如枚举类可以实现接口,枚举类可以包含抽象方法,这里就不过多讨论了。
通过这里的讲解,我们已经能够对枚举类轻车驾熟了。有需要用到的话,自己再去找资料也不晚。