【Java】 enum(枚举)使用详解和总结

本文详细介绍了Java中的枚举类型(Enum),包括枚举的类型安全性问题、定义方法和在程序及switch语句中的使用,强调了枚举带来的便利性和可读性提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Enum (枚举)类型的介绍e

枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。

举个例子就明白了;

Public static class RainbowColor { 
   //一周七天的定义
   public static final int Mon = 1; 
   public static final int tue = 2; 
   public static final int wed = 3; 
   public static final int Thu = 4; 
   public static final int Fri = 5; 
   public static final int Sat = 6; 
   public static final int Sun = 7; 
}

在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。

1.类型不安全

由于星期常量的对应值是整数形,所以程序执行过程中很有可能给星期变量传入一个任意的整数值,导致出现错误。

2.没有命名空间

由于星期常量只是类的属性,当你使用的时候不得不通过类来访问。

3.一致性差

因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。

4.类型无指意性

由于一周枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。

枚举类型的定义方法:

在枚举类型中,一般定义形式如下:

enum 枚举名 {枚举值};

其中,enum为java中得关键字。

在枚举值中应该罗列出所有的可用值,这些值称为枚举元素。例如:

enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun};

这里定义了一个枚举类型Weekday,枚举值有7个,即一周有7天。凡被说明为Weekday类型变量的取值,只能是这七天的某一天。

枚举变量也可用不同的方式说明,如先定义后说明,第一的同时说明或直接说明。

设有变量a,b,c被定义为上述的枚举类型Weekday, 可采用下列任一方式。

enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun};//先定义
enum Weekday a, b, c;//后说明
或者为:
enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun} a,b,c;//定义的同时说明
或者为:
enum {Mon,Tue,Wed,Thu,Fri,Sat,Sun} a,b,c;//直接说明

在程序中使用枚举

当创建了一个枚举类型之后,就意味着可在今后的代码中进行调用。调用先前定义的媒体类型同其他的调用语句一样,需要声明该类的一个对象并通过对象对枚举类型进行操作。

enum Mycolor{红色,绿色,蓝色}
public class EnumColor {

	public static void main(String[] args) {


		Mycolor c1 = Mycolor.红色;
		System.out.println(c1);

		Mycolor c2 = Mycolor.绿色;
		System.out.println(c2);

		Mycolor c3 = Mycolor.蓝色;
		System.out.println(c3);
	}
}

输出;

红色
绿色
蓝色

代码详解

在第01行中定义enum数据类型Mycolor. 其中设置的枚举值分别为红色,绿色,蓝色。第07,第10和第13行分别定义了枚举变量c1,c2,c3,其中c1,c2,c3三只能是Mycolor枚举元素中的三个值的一个,他们通过枚举名.枚举值的方法获得,第08,第11和第14行分别输出他们获得的枚举值,由上面的分析可知,通过Java提供的枚举类型,用户可以很轻松的调用枚举中的每一种颜色。

在switch语句中使用枚举

使用enum关键字创建的枚举类型,也可以直接在多种控制语句中使用,如switch语句中,在jdk1.5之前,switch语句只能用于判断字符和数字,他不能对在枚举中罗列的内容进行判断和选择,而在jdk1.5之后,通过enum创建的枚举类型也可以被switch判断使用。

package workspace;
enum Mycolor {红色, 绿色, 蓝色}
public class EnumColor {
	public static void main(String[] args) {

		Mycolor c1 = Mycolor.绿色;
		switch (c1) {

		case 红色: {

			System.out.println("我是红色!");
			break;
		}
		case 绿色: {

			System.out.println("我是绿色!");
			break;
		}
		case 蓝色: {

			System.out.println("我是蓝色!");
			break;
		}
		}
	}
}

输出: 

我是绿色!

代码详解

本题中通过switch调用枚举类型Mycolor完成对枚举类型的筛选,在第7行到第24行中,均是对switch语句的使用,由于Java采用的是Unicode的字符串编码方式,所以枚举值也支持中文,本题可以看出,在jdk1.5之后,switch同样可以用于判断一个枚举类型,并对枚举类型做出有效选择,这样在今后的程序写作过程中,就能够避免枚举类型多而繁琐的选择问题,这有助于增加代码的可读性和延伸性。
 

/** 1. 功能:枚举操作类,枚举类型创建,转换 * 2. 作者:杨磊 * 3. 创建日期:2008-1-30 * 4. 最后修改日期:2008-11-10 **/ using System; using System.Collections.Generic; using System.Text; using System.Collections; /// /// 枚举操作类,枚举类型创建,转换 /// public class EnumHelper { #region 通过字符串获取枚举成员实例 /// /// 通过字符串获取枚举成员实例 /// /// 枚举名,比如Enum1 /// 枚举成员的常量名或常量值, /// 范例:Enum1枚举有两个成员A=0,B=1,则传入"A"或"0"获取 Enum1.A 枚举类型 public static T GetInstance(string member) { return CommFun.ConvertTo(Enum.Parse(typeof(T), member, true)); } #endregion #region 获取枚举成员名称成员值的键值对集合 /// /// 获取枚举成员名称成员值的键值对集合 /// /// 枚举名,比如Enum1 public static Hashtable GetMemberKeyValue() { //创建哈希表 Hashtable ht = new Hashtable(); //获取枚举所有成员名称 string[] memberNames = GetMemberNames(); //遍历枚举成员 foreach (string memberName in memberNames) { ht.Add(memberName, GetMemberValue(memberName)); } //返回哈希表 return ht; } #endregion #region 获取枚举所有成员名称 /// /// 获取枚举所有成员名称 /// /// 枚举名,比如Enum1 public static string[] GetMemberNames() { return Enum.GetNames(typeof(T)); } #endregion #region 获取枚举成员的名称 /// /// 获取枚举成员的名称 /// /// 枚举名,比如Enum1 /// 枚举成员实例或成员值, /// 范例:Enum1枚举有两个成员A=0,B=1,则传入Enum1.A或0,获取成员名称"A" public static string GetMemberName(object member) { //转成基础类型的成员值 Type underlyingType = GetUnderlyingType(typeof(T)); object memberValue = CommFun.ConvertTo(member,underlyingType); //获取枚举成员的名称 return Enum.GetName(typeof(T), memberValue); } #endregion #re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值