java中的枚举(enmu)

从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 api 写道
这是所有 Java 语言枚举类型的公共基本类

其实枚举类型最终会编译成一个继承了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写的也非常清楚了。

猜你喜欢

转载自286.iteye.com/blog/1405522