Java-枚举案例

一、枚举案例 - 状态机

enum Signal{RED, YELLOW, GREEN}

public class EnumTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.println("请输入信号灯:RED,YELLOW,GREEN");
		Signal signal = Signal.valueOf(scan.next());
		String instruct = getTrafficInstruct(signal);
		System.out.println(instruct);
		
		scan.close();
	}

	public static String getTrafficInstruct(Signal signal) {
		String instruct = "信号灯故障";
		switch (signal) {
		case RED:
			instruct = "红灯停";
			break;
		case YELLOW:
			instruct = "黄灯请注意";
			break;
		case GREEN:
			instruct = "绿灯行";
			break;
		default:
			break;
		}
		return instruct;
	}
}

二、枚举案例 - 错误码

public enum ErrorCodeEn {
	
	Ok(1,"成功"),ERROR_A(2,"错误A"),ERROR_B(3,"错误B");
	
	private int code;//状态码
	private String description;//状态信息
	
	ErrorCodeEn(){}
	
	ErrorCodeEn(int code,String description){
		this.code = code;
		this.description = description;
	}

	public int getCode() {
		return code;
	}

	public String getDescription() {
		return description;
	}
}

三、枚举案例 - 组织枚举

含义:可以将类型相近的枚举通过接口或类组织起来(但是一般用接口方式进行组织)

原因是:

​ Java接口在编译时会自动为enum类型加上public static修饰符;

​ Java类在编译时会自动为 enum 类型加上static修饰符;

​ 就是说,在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。

public interface IErrorCode {

	enum LoginErrorCodeEn implements INumberEnum{

		OK(1,"登录成功"),ERROR_A(-1,"验证码错误"),ERROR_B(-2,"密码错误"),ERROR_C(-3,"用户已登录");

		private int code;
		private String description;

		LoginErrorCodeEn(int code,String description){
			this.code = code;
			this.description = description;
		}

		@Override
		public int getCode() {
			return code;
		}
		@Override
		public String getDescription() {
			return description;
		}
	}

	enum RigsterErrorCodeEn implements INumberEnum{

		OK(1,"注册成功"),ERROR_A(-1,"账号已存在");

		private int code;
		private String description;

		RigsterErrorCodeEn(int code,String description){
			this.code = code;
			this.description = description;
		}

		@Override
		public int getCode() {
			return code;
		}
		@Override
		public String getDescription() {
			return description;
		}
	}

}

interface INumberEnum {
	int getCode();
	String getDescription();
}

四、枚举案例 - 策略枚举

优点:这种枚举通过枚举嵌套枚举的方式,将枚举常量分类处理。

这种做法虽然没有switch语句简洁,但是更加安全、灵活。

public enum Salary {
	JAVA(SalaryType.TEACHER),
    HTML(SalaryType.TEACHER),
    PYTHON(SalaryType.TEACHER),
	PRINCIPAL(SalaryType.ADMINISTRATION);//校长
	
	private final SalaryType salaryType;
	
	Salary(SalaryType salaryType){
		this.salaryType = salaryType;
	}
	
    //baseSalary-底薪 classHour-课时 teachingHourSubsidy-课时费 achievements-绩效
	double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements){
		return salaryType.getSalary(baseSalary, classHour, teachingHourSubsidy, achievements);
	}
	
	//策略枚举
	private enum SalaryType {
		
		TEACHER {//老师
			@Override
			double getSalary(double baseSalary, int classHour, double teachingHourSubsidy,
					double achievements) {
				return baseSalary + classHour*teachingHourSubsidy + achievements;
			}
		},
		ADMINISTRATION {//行政人员
			@Override
			double getSalary(double baseSalary, int classHour, double teachingHourSubsidy,
					double achievements) {
				return baseSalary + achievements;
			}
		};
		
		abstract double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements);
	}
}

五、枚举工具类 - EnumSet 和 EnumMap

Java 中提供了两个方便操作enum的工具类——EnumSet 和 EnumMap。

EnumSet :枚举类型的高性能 Set实现。它要求放入它的枚举常量必须属于同一枚举类型。
EnumMap :专门为枚举类型量身定做的 Map 实现。虽然使用其它的 Map 实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用 EnumMap 会更加高效,因为它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值。这使得 EnumMap 的效率非常高。

public class EnumTest {
	public static void main(String[] args) {
		
		//EnumSet的使用
        //把Signal枚举中所有对象抽取到Set集合中
		EnumSet<Signal> signalSet = EnumSet.allOf(Signal.class);
		for (Enum<Signal> en : signalSet) {
			System.out.println(en);
		}
		
		//EnumMap的使用
		EnumMap<Signal,Object> enumMap = new EnumMap<>(Signal.class);
		enumMap.put(Signal.RED, "红灯");
		enumMap.put(Signal.YELLOW, "黄灯");
		enumMap.put(Signal.GREEN, "绿灯");
        //把所有的映射关系对象抽取到Set集合中
		Set<Entry<Signal, Object>> entrySet = enumMap.entrySet();
		for (Entry<Signal, Object> entry : entrySet) {
			Signal key = entry.getKey();
			Object value = entry.getValue();
			System.out.println(key + " -- " + value);
		}
	}
}
enum Signal{RED, YELLOW, GREEN}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值