`
lantian_123
  • 浏览: 1360976 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

enum(java中的枚举)

    博客分类:
  • Java
 
阅读更多

Java 中的枚举(enum

枚举就是一组有限数据的集合,比如:性别就可以用枚举表示,他们的元素分别为男、女,最多还加个未知或者人妖。

 

枚举也是一种特殊的类,与普通类的区别在于普通类在定义的时候不明确他将会有哪些实例对象存在,完全由程序员自己去生成实例,而枚举只是他的值在定义的时候就已经实例话了,如下面的枚举定义方式:

 

 

/**
 * 定义了颜色有红、绿、蓝三种颜色的枚举类型
 * @author lzjun
 *
 */
public enum Color {
	RED,GREEN,BLUE
}

枚举与类相同的地方在于,定义了一个枚举时,编译器同样会生成一个相关的类,这个类是继承的java.lang.Enum.

 

 

     System.out.println(Color.BLUE.getClass());
		
     System.out.println(Color.BLUE.getClass().getSuperclass());

 输出结果:class com.lzjun.Color

                class java.lang.Enum

从输出结果可以很明确的看出枚举本质上就是一个类,而他的父类是Enum.

既然是一个类的话,他就有类的特性,包括属性和方法。
		/**
		 * 三个static方法
		 */
		// 根据String类型参数返回一个枚举值
		System.out.println(Color.valueOf("BLUE"));  
		//返回该枚举中所有枚举值作为一个数组,顺序依然按照初始化的状态存放
		System.out.println(Color.values());       
		//此方法继承与Enum中的valueOf方法,作用与第一个方法类似,具体使用可以参看jdk文档
		System.out.println(Color.valueOf(Color.class, "RED")); 
		
 实例方法,继承自Enum
                Color.BLUE.compareTo(Color.GREEN);  //比较枚举的顺序
		Color.BLUE.name();       //返回枚举的名称
		Color.BLUE.ordinal();    //返回该枚举值在枚举定义时的位置
 我们可以查看Enum的源码可以看出:
1、Enum类为抽象的
2、该类中没有ValueOf(String)方法和Values()方法
那么我们是否自己可以写一个继承Enum类的类呢,答案是否定的,编译器根本不允许你这么干,难道Enum就成摆设了?
我们可以尝试去反编译Color,看看创建一个枚举的时候,编译器究竟帮我们做了什么事情?
public final class com.lzjun.Color extends java.lang.Enum{
    public static final com.lzjun.Color RED;
    public static final com.lzjun.Color GREEN;
    public static final com.lzjun.Color BLUE;
    static {};
    public static com.lzjun.Color[] values();
    public static com.lzjun.Color valueOf(java.lang.String);
}
 从代码看出其实这个Enum类是用来被继承的。
当然同样可以和普通类一样的去使用,除继承之外
/**
 * 任意的扩展此枚举类
 * @author lzjun
 *
 */
public enum Color implements SomeInterface{
	RED,GREEN,BLUE("蓝色");
	private String description;
	private Color(){};
	
	private Color(String description){
		this.description  = description;
	}
	@Override
	public String toString() {
		return description;
	}
	
	public static void main(String[] args) {
		System.out.println(BLUE);
	}
}
 

enum还有一个重要的特点是就是可以用于switch语句。当然jdk7包括字符串在内的类型也能用于switch这个多路分支判断语句。

 

enum既然是一个集合,但遗憾的是他不能改变大小,就像数组一样,于是就诞生了EnumSet类,这样我们就可以像集合一样对他做CURD操作了.

 

分享到:
评论
1 楼 dingding5060 2011-08-24  
没太看懂

相关推荐

Global site tag (gtag.js) - Google Analytics