枚举是很多面向对象语言都会有的一种类型,它可以将表达同一类型的变量组合成一个集合,组成一个常量集
在Java中也有枚举类型,是用enum关键字来表示的
枚举常用来表示一个常量集,用来限定变量的取值,只能在枚举的范围内,比如一年四季只有春、夏、秋、冬、一个星期只有周一到周日,这类固定的常量就比较适合用枚举来表达
当然你说我用静态的常量来表达行不行呢?也是可以的,只是枚举就是为这种场景而生的
枚举这种类型其实没什么存在感,大家在使用的时候也是使用最基本的用法,甚至很多人都不用枚举,至少我自己在写这篇文章之前是很少用 枚举类型的,经常会用静态常量来代替枚举,但枚举确实有他的好处,下面我们就一起来看一下
枚举的简单用法public enum OrderState { ORDER_CONFIRM,ORDER_PAYED,ORDER_DELIVERY,ORDER_FINISH }OrderState列举了订单的几种状态
ORDER_CONFIRM 订单已确认ORDER_PAYED 订单已支付ORDER_DELIVERY 订单已出库ORDER_FINISH 订单已完成OrderState orderState = OrderState.ORDER_FINISH; System.out.println(orderState);在使用枚举类型时,需要定义一个枚举类型的对象,如上代码,执行结果如下:
ORDER_FINISH枚举类型常用的方法
values() 返回所有的枚举值数组ordinal() 表示枚举值在枚举类型中的次序,从0开始compareTo() 用于比较两个枚举类型name() 返回枚举值// values()返回所有的枚举值 for (OrderState os :OrderState.values()) { //枚举值的次序 System.out.println(os "|" os.ordinal()); //比较 System.out.println(os.compareTo(OrderState.ORDER_FINISH)); //枚举值 System.out.println(os.name()); System.out.println("------------------"); } 向枚举中添加方法在枚举的简单用法中,枚举类里面只定义了几个常量,其实枚举类型中还可以增加方法
public enum OrderState { ORDER_CONFIRM(0,"订单已确认"),ORDER_PAYED(1,"订单已支付"),ORDER_DELIVERY(2,"订单已支付"),ORDER_FINISH(3,"订单已完成"); private int state; private String stateText; OrderState(int state,String stateText){ this.state = state; this.stateText = stateText; } public int getState(){ return state; } public String getStateText(){ return stateText; } public static void main(String[] args){ for(OrderState orderState : OrderState.values()){ System.out.println(orderState "|" orderState.getState() "|" orderState.getStateText()); } } }从上面的代码可以看出来,枚举类型可以有构造方法,也可以有普通方法,枚举跟类很像,或者说它就是一种拥有限制的类
switch中的枚举枚举跟switch语句简直是天造地设的一对,switch中可以天然的支持枚举类型
switch (orderState){ case ORDER_CONFIRM: System.out.println(orderState.getState()); break; case ORDER_PAYED: System.out.println(orderState.getStateText()); break; case ORDER_DELIVERY: System.out.println(orderState.getState()); break; case ORDER_FINISH: System.out.println(orderState.getStateText()); break; } 枚举的真面目我们用编译/反编译的方法来看一下枚举到底是个什么鬼类型
首先编译OrderState.java文件,注意你的枚举类型中有中文需要加-encoding参数用UTF-8进行编码,否则会编译不通过
javac -encoding UTF-8 OrderState.java执行完成后,在同一目录下会生成一个OrderState.class文件,我们反编译回来
javap -p OrderState.class会得到如下的代码
//枚举就是一个继承自Enum的类 public final class org.kxg.enumDemo.OrderState extends java.lang.Enum制图网(www.makepic.net),专业的logo免费设计在线生成网站,全自动智能化logo设计,商标设计,logo在线生成!
欢迎使用制图网制作属于您公司自己的logo,不仅专业而且经济实惠,全方位满足您公司品牌化、视觉化的需求。