从jdk1.5开始,java增加了enum(枚举)这个类型,但是大家在平时运用中还是比较少用到枚举的,而且很多人和我一样对枚举一知半解,下面就跟大家一起学习下enmu枚举。
先看一个最简单的枚举类型,一个返回类型的枚举:
public enum ResultType {
/**
* 成功
*/
SUCCESS,
/**
* 失败
*/
FAIL,
/**
* 异常
*/
EXCEPTION,
/**
* 错误
*/
ERROR,
/**
* 无结果
*/
NONE;
}
众所周知枚举中可以定义一些常量,但这些常量岂不是跟普通的常量相同?
public interface ResultType {
/**
* 成功
*/
public static final String SUCCESS;
/**
* 失败
*/
public static final String FAIL;
/**
* 异常
*/
public static final String EXCEPTION;
/**
* 错误
*/
public static final String ERROR;
/**
* 无结果
*/
public static final String NONE;
}
1. 第一点不同就是,在现在流行的jdk版本中String型无法switch,据说jdk7已经支持,但是那还不是主流。在flex中switch就支持String型,但是String字符串容易写错,极容易造成不必要的bug。
2. 如果非用String型那就得用大量的if…else…来进行判断,这时选用枚举就非常简单了,况且这个例子才只有几个字段,如果地名,国家等等,维护起来也非常不便。
3. 即时不是String类型,用到的是int型,可以用到switch,那么就会出现一种异常情况,就是switch的case中没有这个int类型,或是int型常量的值错误,前者无论是用接口常量还是枚举类型都会发生,但后者就只会在接口常量中发生。这时我们就不得不拿出大量精力去避免和维护这种情况。然而枚举就不会出错,这就是好处,有简单的方法为什么不用呢?
4. 而且枚举也可以进行赋值,这样就完全可以胜任一些类型匹配,状态匹配等等的情况了。例如:数据库中存储的返回类型对应值是成功1,失败2,异常3,错误4,无结果5.我们就可以在枚举中像下面这样进行赋值:
public enum ResultType {
/**
* 成功
*/
SUCCESS(1),
/**
* 失败
*/
FAIL(2),
/**
* 异常
*/
EXCEPTION(3),
/**
* 错误
*/
ERROR(4),
/**
* 无结果
*/
NONE(5);
//定义自己的属性,可以是其他类型,例如String,boolean…
private final int value;
/**
* 采用自定义属性的构造方法
*/
ResultType(int value) {
this.value = value;
}
/**
* 得到对应值
*
* @return the value
*/
public int getValue() {
return value;
}
}
这样我们就可以通过类似于ResultType. SUCCESS.getValue()获取相应类型的值了,这里需要注意的是我们可以定义value的类型为其他类型,如:String,boolean,double…等等。
java.lang. Enum与枚举是什么关系:
我们在读api或源代码的时候会发现java.lang包下有一个Enum类,这个类又是什么呢?
其实枚举类型最终会编译成一个继承了java.lang.Enum的类,所以枚举并没有什么特别之处。
我们看到Enum类中有一些公共的方法,我们常用的有equals,valueOf等。
这个equals我们很熟悉,是String型比较相同字符串时最常用的,但在枚举里该怎么用呢?
boolean s=ResultType.ERROR.equals("ERROR");
System.out.print(s);
//false
打印出来的结果是不匹配。
boolean s=ResultType.ERROR.equals(ResultType.ERROR);
System.out.print(s);
//true
结果是相同,说明枚举在比较的时候是在这么用的。
valueOf也比较简单,是将对象转换成枚举的方法:
ResultType.valueOf("ERROR");
还有一些不太常用的方法,api写的也非常清楚了。