java枚举是java引用数据类型中的一种,从JDK1.5开始才引入了枚举,为什么会出现枚举呢?正因为会经
常涉及到相关的操作,所以在开发中把这样具有鲜明特征的功能单独的抽象出来使用。那么具体是什么样特点呢?
即这个枚举中的实例是有限个数的,即无法继续扩展其实例的时候(如周几只有七个实例,性别只有两个实例等)
类似于这样的类,我们就可以设置出枚举(特别要注意的是,当只有一个类时,此时可以当做性能还不错的单例模
式,其线程安全问题在底层已经实现),我认为枚举更好的一种称呼是穷举,实例有限且固定接下来就简单进行一
些枚举类和方法的介绍:
//枚举类的定义格式,也是一个class,只是没写出来,其实为继承java.lang.enum
//java是单一继承,所以枚举不能再继承
public enum WeekDay{
//在第一行代码中必须枚举出所有的实例
MON,TUE,WED,THU,FRI,SAT,SUN;
private WeekDay(){
//默认的构造器,构造器必须是私有化的
}
MON.ordinal();//枚举实例的序数(0,1,2,3,4,5,6,7)
MON.compareTo(WED);//等价于MON.ordinal-WED.ordinal=-2
WeekDay.values();//返回存储WeekDay所有实例对象的数组,任何一个实例.values()其实都可取得
MON.getDeclaringClass();//返回和当前枚举常量的枚举类型对应的calss对象
}
上面的代码因为是在本类中调用,所以直接使用了实例.方法(),而通常我们会在其他类中去掉用,就因该写为:WeekDay.MON;(可以用另外的变量去接收WeekDay mon = WeekDay.MON;),还有一种获取枚举的单个实例的方式是:WeekDay TUE = Enum.valueOf(WeekDay.class, “TUE”);
还有一个值得注意的点是,枚举类是构造器是可以带参数的,只不过这个时候定义的实例同样要带实参!
如:
MON("星期一");
privata String val;
private WeekEnum(String val) {
this.val = val;
}
还有一个比较重要的作用也就是配合switch,一般来说switch中只能使用整数值,而枚举实例天生就具有整数次序(ordinal()的次序可以使用,显然编译器帮我们做了类似的工作),例子:
public enum OperationEnum {
A,B,C,D; //ABCD代表加减乘除
public static Double getResult(Double num1,Double num2,OperationEnum op) {
Double result = 0D;
switch(op) {
case A: result = num1+num2;
break;
case B: result = num1-num2;
break;
case C: result = num1*num2;
break;
case D: result = num1/num2;
break;
}
return result;
}
public static void main(String[] args) {
System.out.println(OperationEnum.getResult(3d, 2d, D));
}
}
感谢阅读,你的指正和建议是我进步的动力~