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}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部