一、前言
在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)); }}
这种枚举用法,通常还可用于系统的错误码与对应的错误码描述,然后根据错误码获取错误码对应的描述。
三、其它用法
java中的枚举还有许多其它的用法,如重写toString()、equals()等方法,实现接口、枚举Map等等,但感觉其实用的并不是很多,这里就不再详述了,直接给2个简单的例子吧。
例5:
public class TestEnum { public static void main(String[] args) { //返回此枚举常量的名称,继承自java.lang.Enum类,通常重写该方法以实现相关操作。输出->SF System.out.println(CompanyEnum.SF.toString()) //返回此枚举常量的名称。输出->SF System.out.println(CompanyEnum.SF.name()) //返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。输出->0 System.out.println(CompanyEnum.SF.ordinal()) //获取枚举中的常量个数。输出->5 System.out.println(CompanyEnum.SF.values().length) //返回带指定名称的指定枚举类型的枚举常量。输出->顺丰速运 System.out.println(CompanyEnum.SF.valueOf(CompanyEnum.class, "SF").getCompany()) //比较此枚举与指定对象的顺序 System.out.println(CompanyEnum.SF.compareTo(CompanyEnum.YTO)) //返回与此枚举常量的枚举类型相对应的 Class 对象。输出->class com.cndmss.util.CompanyEnum System.out.println(CompanyEnum.SF.getDeclaringClass()) //。输出->true System.out.println(CompanyEnum.SF.name().equals("SF")) //。输出->true System.out.println(CompanyEnum.SF.equals(CompanyEnum.SF)) //。输出->false System.out.println(CompanyEnum.SF.equals(CompanyEnum.YTO)) }}
- 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
- 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
例6:
/** *EnumSet、EnumMap的使用 */public class TestEnum { public static void main(String[] args) { EnumSet<CompanyEnum> companySet = EnumSet.allOf(CompanyEnum.class); for (CompanyEnum company:companySet) { System.out.println(company.getCode() + ":" + company.getCompany()); } EnumMap<CompanyEnum, String> companyMap = new EnumMap(CompanyEnum.class); companyMap.put(CompanyEnum.SF, "顺丰map"); companyMap.put(CompanyEnum.YTO, "圆通map"); Iterator<Entry<CompanyEnum, String>> iter = companyMap.entrySet().iterator(); while(iter.hasNext()){ Entry<CompanyEnum, String> entry = iter.next(); System.out.println(entry.getKey().name() + ":" + entry.getValue()); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
四、总结
1、所有枚举类都是继承java.lang.Enum类,可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不过,因为java是单继承,所以枚举不能再继承其它类,但枚举可以实现接口。
2、不使用枚举也可以用其它方式代替实现类似的效果,而灵活地运用枚举可以带来许多便利,但也切忌为了用枚举而用枚举,这样反而可能带来不利的影响。
参考文章:
1、http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html
2、http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.html
3、http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html