枚举Enum


为什么要有枚举?

  • 问题:要定义星期几或者性别的变量,该怎么定义,假设用1-7分别表示星期一到星期日。但有人可能会写成int weekday = 0;
  • 枚举就是要让某个类型的变量的取值只能为若干个固定的值中的一个,否则,编译器就报错误。枚举可以让编译器在编译时就可以控制源程序中的填写的非法值,普通变量的方式在开发阶段无法实现这一目标

所以枚举的优点;编译源程序的时候就可以发现你写的程序合法不合法,起到检验的作用

 

用普通类实现枚举的功能

1.       私有构造方法

2.       每个元素分别用一个共有的静态成员变量表示

3.      可以有若干个公有方法或抽象方法例如nextDay()方法必须是抽象的,采用抽象方法定义就是可以将if。。。else语句转换成一个个独立的类

枚举的基本应用

l         举例:定义一个Weekday的枚举

l         扩展:枚举类的valuesvalueof.name.toString.ordinal等方法

l         总结:枚举是一个特殊的类,其中的每一个元素都是该类的实例对象

 

普通类实现枚举  
 

package lxl.test;
/**
 * 用普通类模拟枚举类
 * @author Administrator
 *
 */
public abstract class WeekDay1 {

	private WeekDay1(){}
	
	public static final WeekDay1  SUN= new WeekDay1(){

		@Override
		public WeekDay1 nextDay() {
			// TODO Auto-generated method stub
			return MON;
		}
		
	};
	public static final WeekDay1  MON= new WeekDay1(){

		@Override
		public WeekDay1 nextDay() {
			// TODO Auto-generated method stub
			return SUN;
		}
		
	};
	
	public abstract WeekDay1 nextDay();
	
/*	public Weekday nextDay(){
		if(this == SUN)
			return MON;
		else
			return SUN;
	}*/
	
	public String toString() {
		return this==SUN?"SUN":"MON";
	}
}


l         枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法

l         枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分隔,把枚举中的成员方法或者变量等放在枚举元素的前面,编译器报告错误。

l         带构造方法的枚举

1.       构造方法必须定义成私有的

2.       如果有多个构造方法该如何选择那个构造方法呢?

3.       枚举元素MONMON()的效果一样,都是调用默认的构造方法。

 

l         带方法的枚举

1.       定义枚举TrafficLamp

2.       实现普通的next方法

3.       定义抽象的next方法:每个元素分别是由枚举类的子类生成的实例对象,这些子类采用类似内部类的方式进行定义。

4.       增加表示时间的构造方法

 

 

枚举例子:

/**
 * 枚举测试
 * @author Administrator
 *
 */ 
public class EnumTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		WeekDay1 weekday = WeekDay1.SUN  ;
		System.out.println(weekday.nextDay());
		
		WeekDay weekDay = WeekDay.FRI;
		System.out.println(weekDay);
		System.out.println(weekDay.name());
		System.out.println(weekDay.ordinal());
		//把一个String编程一个枚举对象
		System.out.println(WeekDay.valueOf("SUN"));
		//values()方法返回一个数组
		System.out.println(WeekDay.values().length);
		
		
		TrafficLamp tl = TrafficLamp.RED;
		System.out.println(tl);
		System.out.println(tl.nextLamp());
	}

	/**
	 * 枚举 Enum
	 * @author Administrator
	 *
	 */
	public enum WeekDay{
		//元素列表
		SUN(0),MON(),TUE,WED,THI,FRI,STA;//元素列表之后如果有东西就必须有";"。没有可省略
		//元素列列表中的元素初始化调用对应的构造方法
		private WeekDay(){System.out.println("无参数构造方法");};
		private WeekDay(int day){System.out.println("带参数的构造方法");};
		
	}

	/**
	 * 交通灯,,比较复杂的枚举
	 * @author Administrator
	 *
	 */
	public enum TrafficLamp{
		//初始化红、黄、绿灯
		RED(30){
			public TrafficLamp nextLamp(){
				return GREEN;
			}
		},GREEN(45){
			public TrafficLamp nextLamp(){
				return YELLOW;
			}
		},YELLOW(5){
			public TrafficLamp nextLamp(){
				return RED;
			}
		};
		
		
		private int time;

		private TrafficLamp(int time) {
			this.time = time;
		}

		public abstract TrafficLamp nextLamp();
		
	}
	
}


 

如果枚举只有一个成员,就可以作为一个单例的实现方式

### 枚举enum)在编程中的用法 枚举类型是一种用户自定义的数据类型,通常用于表示一组固定的常量集合。这种数据结构可以提高程序的可读性和可维护性[^2]。 #### Java 中的 Enum 使用 在 Java 中,`enum` 是一种特殊的类,它可以被看作是一个具有固定成员列表的类。这些成员通常是不可变的对象实例。由于 `enum` 的特性,它们可以直接用于 `switch` 语句中[^1]: ```java public class Main { public static void main(String[] args) { DayOfWeek day = DayOfWeek.MONDAY; switch (day) { case MONDAY: System.out.println("Start of the work week."); break; case FRIDAY: System.out.println("End of the work week."); break; default: System.out.println("Another day..."); } } enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } } ``` 上述代码展示了如何利用 `enum` 定义一周的日子,并将其作为参数传递给 `switch` 语句来执行不同的逻辑操作。 #### C/C++ 中的 Enum 使用 在 C 和 C++ 编程语言里,`enum` 关键字主要用于创建一系列命名整数常量。尽管不像高级语言那样功能强大,但它仍然有助于增强代码清晰度和减少错误可能性[^3]: ```c #include <stdio.h> int main(void){ enum Color { RED=0xFF0000, GREEN=0x00FF00, BLUE=0x0000FF }; int selectedColor = GREEN; if(selectedColor == RED){ printf("#%X\n",RED); }else if(selectedColor == GREEN){ printf("#%X\n",GREEN); }else{ printf("#%X\n",BLUE); } return 0; } ``` 在这个例子中,我们定义了一个名为 `Color` 的枚举类型并初始化了一些颜色值。接着通过简单的条件判断打印出对应的颜色十六进制码。 #### Python 中的 Enum 使用 从 Python 3.4 开始引入了标准库模块 `enum` 来支持枚举类型的声明与使用;而在 Python 3.10 及之后版本,则进一步增强了内置的支持程度使其更接近传统意义上的枚举行为模式: ```python from enum import Enum class Season(Enum): SPRING = 'spring' SUMMER = 'summer' AUTUMN = 'autumn' WINTER = 'winter' def describe_season(season:Season)->str: match season.name.lower(): case "spring": description="Flowers bloom." case "summer": description="Sun shines brightly." case _ : description=f"{season.value.capitalize()} weather is here!" return f"In {season.name}, "+description print(describe_season(Season.SPRING)) ``` 这里演示了怎样借助于新加入的关键字 `match-case`(类似于其他语言里的 `switch`) 结合枚举变量一起工作以生成季节描述字符串。 --- ### 总结 无论是在哪种主流编程语言环境下,合理运用好枚举类型都能让我们的源代码变得更加直观易懂同时也降低了潜在风险因素的存在几率。以上分别介绍了几种不同风格的语言对于该特性的具体实践方法论及其优势所在之处.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值