java枚举
枚举定义了一个变量的可使用范围,能够使程序可读性提高。
一个简单的枚举类:
enum Week { Mon,Tue,Wed,Thu,Fri,Sta,Sun; }
- enum和class、interface的地位一样
- 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
- 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
- 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
- 枚举类的构造器只能是私有的。
枚举类内也可以定义属性和方法,可是是静态的和非静态的。
enum Week { Mon("星期一"),Tue("星期二"),Wed("星期三"),Thu("星期四"),Fri("星期五"),Sta("星期六"),Sun("星期日"); private final String name; private Week(String name){ this.name=name; } public String getName() { return name; } }
由于这里是有参的构造函数,所以在定义枚举实例时要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。
构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。
枚举类中有四种方法:
- valueOf()返回指定名字、给定类的枚举常量。
- toSting()返回枚举常量名。
- ordinal() 返回枚举常量在enum声明中的位置,位置从0开始计数。
- compareTo(E other) 如果枚举常量出现在other之前,则返回一个负值;如果this==other,则返回0;否则返回正值。枚举常量出现次序在enum声明中给出。
对上面的星期的枚举类,我们写个测试函数:
public class TestWeek{ public static void main(String[] args) { Week w = Enum.valueOf(Week.class, "Wed");//返回Week枚举类中Wed的枚举常量 System.out.println(w); System.out.println(Week.Wed.toString());//返回枚举常量名 System.out.println(Week.Wed.ordinal());//返回Wed在枚举类中的位置 Week[] week = Week.values();//返回一个包含枚举值的数组 for(Week value:week){ System.out.println(value); } } }
枚举的应用
在网上查找了一些枚举值的应用
- 检查权限之类的,如一个经理、员工、顾客对一个工具的使用权限,一般用枚举来处理 因为这样子可以用来控制传入判断的参数只能够是该枚举类型的数,从而限制传入的参数。
- A系统调用B系统服务,可能会抛出异常,那么异常就可以使用枚举类型,这样A系统就可以不管B系统怎么添加异常类型。A系统都可以捕获所有的异常。
1.
enum AccessRight{ MANAGER,DEPARMENT,EMPLOYEE; }
public class AccessControl { public static boolean checkRight(AccessRight access){ if(access == AccessRight.MANAGER){ return true; }else if(access == AccessRight.DEPARMENT){ return false; }else{ return false; } } public static void main(String[] args) { System.out.println(checkRight(AccessRight.DEPARMENT)); } }
2.
enum MYException{ //枚举类型的值必须在枚举类起始部分定义 NAMEISNULL("NAMEISNULL","姓名为空"),//姓名为空异常 AGEISNULL("AGEISNULL","年龄为空");//年龄为空异常 //枚举类型也是一种类,可以有数据域。 private String exceptionCode;//异常代码 private String exceptionDesc;//异常描述 //枚举类型构造方法必须为private以防在枚举类型外创建对象,默认也是private private MYException(String exceptionCode, String exceptionDesc) { this.exceptionCode = exceptionCode; this.exceptionDesc = exceptionDesc; } public String getExceptionCode() { return exceptionCode; } public String getExceptionDesc() { return exceptionDesc; } }
public class EnumDemo { public static void main(String[] args) { //直接使用枚举类型 System.out.println(MYException.NAMEISNULL.getExceptionCode()); //返回所有Exception类型的对象 MYException es[] = MYException.values(); for(MYException e :es){ //toString返回枚举类型的对象名 System.out.println(e.toString()); //ordinal 返回枚举类型对象在枚举类中的位置 System.out.println(e.ordinal()); } } }