从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写的也非常清楚了。