MyException - 我的异常网
当前位置:我的异常网» 编程 » Java学习疑惑(9)-详述枚举,枚举为小弟我们带来了哪

Java学习疑惑(9)-详述枚举,枚举为小弟我们带来了哪些便利

www.MyException.Cn  网友分享于:2013-09-25  浏览:3次
Java学习疑惑(9)--详述枚举,枚举为我们带来了哪些便利?

枚举是JDK1.5的新加入的特性,Enum一般用来表示一组相同类型的常量,比如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且做比较运算的时候可以用==来替换equals

当我们在编写源代码的时候需要让某个类型的变量的取值缩小在一个人为控制的范围内时,枚举就可以在这个时候大显身手了,否则编译器就会报错。枚举可以让编译器在编译就可以控制程序中编写的非法值,普通变量的方式在开发阶段无法实现这一目标。这里我们使用定义星期的枚举来演示一下,感受一下使用枚举给我们编程带来的方便之处:

public class EnumTest {
	public static void main(String[] args) {
		//由于构造方法私有化,所以这里并不能直接new创建一个Weekday对象,必须指定到定义好的对象(限定了定义范围)
		Weekday monday = Weekday.MON;
		//枚举在定义的时候直接强制继承了java.lang.Enum,由于Java不支持多继承,所以只能实现接口类扩展
		System.out.println("monday.nextDay() :" + monday.nextDay());
		//获取monday的值
		System.out.println("monday.getValue() :" + monday.getValue());
	}
	
	enum Weekday {
		SUN {
			public Weekday nextDay() {
				return MON;
			}
		},
		MON {
			public Weekday nextDay() {
				return TUE;
			}
		},
		TUE {
			public Weekday nextDay() {
				return WED;
			}
		},
		WED {
			public Weekday nextDay() {
				return THI;
			}
		},
		THI {
			public Weekday nextDay() {
				return FRI;
			}
		},
		FRI {
			public Weekday nextDay() {
				return SAT;
			}
		},
		SAT {
			public Weekday nextDay() {
				return SUN;
			}
		};
		//构造方法必须申明为私有private
		private Weekday() {}
		//注意在枚举声明中枚举常量列表要在声明内容的最前面,
		// 若后面还有其他内容(方法等),则列表后要加分号区分开来,
		// 若没有其他内容可以不加,但鉴于编码习惯,提倡还是随手加上分号
		public abstract Weekday nextDay();
		public int getValue() {
			return this.ordinal();
			//这里直接使用了ordinal方法返回其在枚举声明中的序数,其中初始常量序数为零
			//即这里从SUN到SAT值分别为0-6
		}
	}
}


 

通过上面的简单实例我们可以看到在某些情况下使用枚举会增强程序的健壮性、可维护性,然而有时候使用枚举还可以增强程序安全性直接在编译的时候告知程序员错误,减少不少的开销,特别是应用于switch方法参数时效果尤其明显,我们还是通过一个例子感受一下通过枚举优化的switch方法前后的不同之处:

class EnumTest2 {
	public static void main(String[] args) {
		printColor(1);
		printColor(2);
		printColor(3);
		printColor(4);
	}
	public static void printColor(int color) {
		switch(color) {
			case 1:
				System.out.println("这是红色");
				break;
			case 2:
				System.out.println("这是绿色");
				break;
			case 3:
				System.out.println("这是黑色");
				break;
			default:
				System.out.println("未知颜色");
		}
	}
}


上面的printColor方法虽然完成了我们对程序的基本要求,但是如果在调用方法时传入了其他参数比如4,那么就没有意义,并且调用者不知道为何如此,如果此时程序还是接着运行非常危险,所以我们有义务告诉调用者发生了什么导致上面的情况。

			default:
				throw new ColorTypeException("未知颜色!");

将default语句修改成这样并声明一个颜色异常类在传入错误参数的时候告知调用者,
上面的方法有所改进,让调用者知道自己犯了什么样的错误,增强了安全性,但是还不够。
我们可以想想printColor这样单纯的方法在内部还要做一些入参判断和异常处理,如此一来给程序增加了负荷。
我们能不能想到一种方法在传入参数的源头就对参数进行一下约束,压根就不让错误的参数传进来呢?当然可以,下面就来看看运用枚举的优化方案是怎样的

class EnumTest2 {
	public static void main(String[] args) {
		Color red = Color.RED;
		Color green = Color.GREEN;
		Color black = Color.BLACK;
		
		printColor(red);
		printColor(green);
		printColor(black);
		
		// Color other = Color.WHITE;
		// printColor(other);
		// 上面语句编译报错,通过枚举直接在向方法导入参数的时候严格限定了范围,也就不需要default语句了
	}
	public static void printColor(Color color) {
		switch(color) {
			case RED:
				System.out.println("这是红色");
				break;
			case GREEN:
				System.out.println("这是绿色");
				break;
			case BLACK:
				System.out.println("这是黑色");	
				break;
		}
	}

	enum Color {
		RED,GREEN,BLACK;
	}
}


 

使用枚举之后我们发现在真正意义上对入参进行了范围控制,并且在编译的时候就可以发现错误,大大节省了成本。

当然,使用枚举带来的便利还远远不止这些,上面只是冰山一角,我们在程序开发时,需要考虑各种各样的实现方法并从中选择最优者,这是一项非常重要的技能。优秀的程序员不会满足于临时解决方案。


 

 

文章评论

程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
中美印日四国程序员比较
中美印日四国程序员比较
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
旅行,写作,编程
旅行,写作,编程
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员应该关注的一些事儿
程序员应该关注的一些事儿
我是如何打败拖延症的
我是如何打败拖延症的
如何成为一名黑客
如何成为一名黑客
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
为什么程序员都是夜猫子
为什么程序员都是夜猫子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员都该阅读的书
程序员都该阅读的书
10个调试和排错的小建议
10个调试和排错的小建议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员和编码员之间的区别
程序员和编码员之间的区别
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
 程序员的样子
程序员的样子
每天工作4小时的程序员
每天工作4小时的程序员
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
漫画:程序员的工作
漫画:程序员的工作
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
那些争议最大的编程观点
那些争议最大的编程观点
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员必看的十大电影
程序员必看的十大电影
老程序员的下场
老程序员的下场
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有