JavaSE----基础知识点10之枚举
枚举
- 枚举
- 引入:
- 本质
- 特点
- 优点
- 枚举的方法
- 枚举案列---状态机
- 枚举案例---错误码
- 枚举案例---组织枚举
- 枚举案例---枚举策略
- 枚举工具类--EnumSet和EnumMap
引入:
编写季节类(Season):该类只有四个对象(spring、summer、autumn、winter)
// 枚举 public enum Season{//建立对象并赋值public static final Season spring=new Season("春天","春意盎然");public static final Season summer=new Season("夏天","夏日炎炎");public static final Season autumn=new Season("秋天","秋风萧瑟");public static final Season winter=new Season("冬天","冬雪飘飘");//创建属性private String name;private String info;public Season(){}public Season(String name,String info){this.name=name;this.info=info;}public String getName(){return name;}public void setName(String name){this.name=name;}public String getInfo(){return info;}public Void setInfo(String info){this.info=info;}@Overridepublic String toString(){return name+"-----"+info;} }//测试类 public class Test{public static void main(String[] args){System.out.println(Season.spring);System.out.println(Season.summer);System.out.println(Season.autumn);System.out.println(Season.winter);} }方法二:
public enum Season{//默认添加了public static final 类名;spring("春天","万物生长"),summer("夏天","唯你超甜"),autumn("秋天","落叶黄昏"),winter("冬天","白雪皑皑");//定义对象//定义属性private String name;private String info;public Season(){}public Season(String name;String info){this.name=name;this.info=info;}//get和set方法public String getName(){return name;}public void setName(String name){this.name=name;}public String getInfo(){return info;}public void setInfo(String info){this.info=info;}//toString方法@Overridepublic String toString(){return name+"---"+info;} } //测试类 public class Test{public static void main(String[] args){System.out.println(Season.spring);System.out.println(Season.summer);System.out.println(Season.autumn);System.out.println(Season.winter);} }注意:枚举一定要在第一句中写上对象,如果没有对象写入分号,再继续编写
本质
枚举看起来向上一种新型的数据类型,但实际上,枚举就是一种受限制的类,并且具有自己的方法。创建自己的enum类时,这个类继承于java.lang.Enum;
//底层源码 //公共的 抽象 类 枚举名称 --就是一个内部类继承 实现 接口 public abstract class Enum<E extends Enum<E>> implements Comparable<E>,Serializable{}
特点
- 枚举就是一个受限制的类,默认继承的是Enum
- 枚举的第一行必须定义该枚举类型的对象,如果不定义则在第一行写入分号
- 枚举类型的对象默认添加:public static final 类名
- 枚举没有继承明确的类(自定义枚举默认继承Enum,Enum默认继承Object)
- 枚举不能被继承
- 枚举里可以有构造方法、成员方法、静态方法、抽象方法
- 枚举可以实现接口
- 枚举里没有定义方法,看样子最后一个对象添加逗号、分号或什么都不添加
优点
- 增强了代码的可读性
- 枚举类型可以直接与数据库交互
- switch语句的优势
- 编译优势
- 枚举编译时没有把常量值编译到代码中去,即使常量值发生改变也不会影响引用常量的类
- 将常量组织起来,统一管理
- 去除equals两者判断,由于常量值地址唯一,使用枚举可以直接通过"==0"进行两个值之间的对比,性能会有所提高
枚举的方法
| 方法名 | 解释 |
|---|---|
| Enum.valueOf(classenumType,String name) | 根据字符串找到该枚举的对象 |
| public static void values() | 获取该枚举对象数组 |
| public static vod valueOf(String argsO) | 根据字符串获取该枚举类中的对象 |
| public final String name() | 获取该枚举对象名字 |
| public final Class getDeclaringClass() | 获取枚举对象的枚举类型相对应的Class对象 |
| public final int hashCode() | 获取该枚举对象的hash值 |
| public final int compareTo(E o) | 两个枚举对象进行比较 |
| public final boolean equals(Object other) | 比较两个枚举对象是否相同 |
枚举案列—状态机
import java.util.Scanner;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 instrict=getTrafficInstruct(signal);System.out.println(instrict);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 ErroCodeEn{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;}//get/set方法public int getCode(){return code;}public void setCode(int code){this.code=code;}public String getDescription(){return dscription;}public void setDescription(String desription){this.desription=desription;} }
枚举案例—组织枚举
含义:可以将类型相近的枚举通过接口和类组织起来(但是一般用接口的方式进行组织)
原因是:
- 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;}@Overridepublic int getCode(){return code;}@Overridepublic 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;}@Overridepublic int getCode(){return code;}@Overridepublic 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;}double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements){return salaryType.getSalary(baseSalary,classHour,teachingHourSubsidy,achievements);}//策略枚举private enum SalaryType{TEACHER{@Overridedouble getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements){return baseSalary+classHour*teachingHourSubsidy+achievements;}},ADMINISTRATION{@Overridedouble 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的效率非常高
import java.util.EnumMap; import java.util.EnumSet; import java.util.Map; import java.util.Set;public class EnumTest{public static void main(String[] args){EnumSet<Signal> signalSet=EnumSet.allOf(Signal.class);for(Enum<Signal>en:signalSet){System.out.println(en);}//EnumMap的使用//把Sinal枚举中所有对象抽取到Set集合中EnumMap<Signal,Object> enumMap=new EnumMap<>(Signal.class);enumMap.put(Signal.RED,"红灯");enumMap.put(Signal.YELLOW,"黄灯");enumMap.put(Signal.GREEN,"绿灯");//把所有的映射关系对象抽取到Set集合中Set<Map.Entry<Signal,Object>> entrySet=enumMap.entrySet();for(Map.Entry<Signal,Object> entry:entrySet){Signal key=entry.getKey();Object value=entry.getValue();System.out.println(key+"----"+value);}} } enum Signal{RED,YELLOW,GREEN}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
