一、前言
在Java编程过程中,我们通常需要定义一些固定数量的常量,在jdk1.5以前,通常的做法是定义一个静态常量类,但自jdk1.5后,java引入了枚举(关键字enum,全称为 enumeration,值类型),在枚举中,我们可以把相关的常量分组到一个枚举类型里,枚举也比常量类有更多灵活的用法,使用枚举,可以有效的提高代码的整洁性、可读性、可维护性等等,这里简单总结一下常用的枚举用法。
二、常用场景
1、作为普通的常量使用,如星期、季节、颜色、城市等等;通常配合switch语句使用。
例1:
定义
public enum WeekEnum {
MON,TUES,WED,THURS,FRI,SAT,SUN;
}
使用
public class TestEnum {
public static void main(String[] args) {
WeekEnum week = WeekEnum.TUES;
switch (week) {
case MON:
System.out.println("星期一");
break;
case TUES:
System.out.println("星期二");
break;
case WED:
System.out.println("星期三");
break;
case THURS:
System.out.println("星期四");
break;
case FRI:
System.out.println("星期五");
break;
case SAT:
System.out.println("星期六");
break;
case SUN:
System.out.println("星期天");
break;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
2、往枚举中添加变量、构造函数、以达到灵活获取指定值的目的(注: Java 要求必须先定义 enum 实例,否则编译会报错);通常用于一些业务系统中定义一些固定值,如用于匹配db中的字段值等。
例2:
定义
public enum CompanyEnum {
SF("顺丰速运", 1001), YTO("圆通速递", 1002),STO("申通物流",1003),YD("韵达快运",1004),YZPY("中国邮政",1005);
private CompanyEnum(String company, int code) {
this.company = company;
this.code = code;
}
private String company;
private int code;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
使用
public class TestEnum {
public static void main(String[] args) {
System.out.println(CompanyEnum.SF.getCode());
System.out.println(CompanyEnum.SF.getCompany());
}
}
例3:
定义
public enum GenderEnum {
MAN(0),WOMEN(1),UNKNOWN(2);
private int code;
private GenderEnum(int code){
this.code = code;
}
public int getCode() {
return code;
}
}
使用
public class TestEnum {
public static void main(String[] args) {
System.out.println(GenderEnum.MAN.getCode());
System.out.println(GenderEnum.WOMEN.getCode());
System.out.println(GenderEnum.UNKNOWN.getCode());
}
}
3、往枚举中添加自己特定方法,以实现自己所需的相关业务逻辑。
例4:
定义
public enum CompanyEnum {
SF("顺丰速运", 1001), YTO("圆通速递", 1002), STO("申通物流", 1003), YD("韵达快运", 1004), YZPY("中国邮政", 1005);
private CompanyEnum(String company, int code) {
this.company = company;
this.code = code;
}
private String company;
private int code;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public static int getCodeByCompany(String company) {
for (CompanyEnum c : CompanyEnum.values()) {
if (c.getCompany().equals(company.trim())) {
return c.code;
}
}
return 0;
}
public static String getCompanyByCode(int code) {
for (CompanyEnum c : CompanyEnum.values()) {
if (c.getCode() == code) {
return c.getCompany();
}
}
return null;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
使用
public class TestEnum {
public static void main(String[] args) {
System.out.println(CompanyEnum.getCodeByCompany("顺丰速运"));
System.out.println(CompanyEnum.getCompanyByCode(1002));
}
}
这种枚举用法,通常还可用于系统的错误码与对应的错误码描述,然后根据错误码获取错误码对应的描述。
1、所有枚举类都是继承java.lang.Enum类,可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不过,因为java是单继承,所以枚举不能再继承其它类,但枚举可以实现接口。
2、不使用枚举也可以用其它方式代替实现类似的效果,而灵活地运用枚举可以带来许多便利,但也切忌为了用枚举而用枚举,这样反而可能带来不利的影响。
3、枚举和常量类的比较:枚举的实现原理就是定义一个类,然后实例化几个由final修饰的这个类的对象,每个实例都带有自己的元信息。而常量相比之下,没有这一层封装,只占用最基本的内存,包括引用,和它的值本身,要简单轻巧很多。如果值可以使用基本类型而不是包装类型,那更不用说了。 不过话又说回来,通常情况下我们没必要在意这种区别。如果用枚举可读性、可扩展性更好,用就是了,枚举占那点内存,沧海一粟。在性能与代码维护性之间,除个别情况,优先选后者。高级编程语言的诞生本身就是硬件提升的背景下,牺牲某些性能来降低开发门槛,提高开发效率的,相对于微小的性能损耗,人力成本更值钱。
其它学习连接:http://blog.csdn.net/qq_27093465/article/details/52180865