当前位置: 首页 > 后端技术 > Java

深入介绍Java中枚举的实现原理

时间:2023-04-02 09:18:26 Java

作者:Magic来源:恒生LIGHT云社区EnumerationinJava——Enum全称Enumeration,在JDK1.5中引入,在java.lang类中被调用。朗包。基本概述在JDK1.5之前,常量的定义是使用:publicstaticfinl。枚举的设计是将相关的常量归为一个枚举类型,方便创建和管理。比如我们要定义一个颜色常量:publicenumColor{RED,YELLOW,BLUE,GREEN}这段代码经过底层编译后,实际创建了4个枚举对象:newEnum("RED",0);newEnum("YELLOW",1);newEnum("BLUE",2);newEnum("GREEN",3);使用enum的条件选择可以简单的通过switch方法条件判断Colorcolor=Colour.RED;switch(color){caseRED:System.out.println("red");休息;案例黄色:System.out.println(“黄色”);休息;案例绿色:系统.out.println(“绿色”);休息;蓝色案例:System.out.println("blue");休息;默认值:System.out.println(color);break;}Loopthrough循环通过.values()可以获取对象中的值for(Coloure:Colour.values()){System.out.println(e.toString());}CollectionmappingInthetypeor我们使用枚举类型作为集合的映射特殊且高效的集合和映射实现可用于键的类型。如:java.util.EnumSet,java.util.EnumMap//EnumSetuseEnumSetcolorSet=EnumSet.allOf(Colour.class);对于(颜色颜色:colorSet){System.out.println(颜色);}//EnumMap的使用EnumMapcolorMap=newEnumMap(Colour.class);colorMap.put(Colour.RED,"red");colorMap.put(Colour.YELLOW,"yellow");colorMap.put(Colour.GREEN,"Green");colorMap.put(Colour.BLUE,"Blue");设置>colorEntries=colorMap.entrySet();for(Map.Entryentry:colorEntries){System.out.println(entry.getKey().name()+":"+entry.getValue());}常用方法通过java.lang.Enum类的源码,你可以探索枚举常用的一些方法和设计思想:publicabstractclassEnum>implementsComparable,Serializable{//Enum的唯一构造函数,由于受保护修饰,这个构造函数不能被调用。它由编译器响应枚举类型声明而发出的代码使用。protectedEnum(Stringname,intordinal){this.name=name;this.ordinal=ordinal;}```//返回此枚举常量的名称,与枚举声明中声明的完全相同。publicfinalStringname(){returnname;}```//返回此枚举常量的序号(它在枚举声明中初始常量被分配零序号的位置)。(但是大部分程序员不会用到这个方法)publicfinalintordinal(){returnordinal;}```//和指定对象比较排序,当这个对象小于、等于或大于指定对象时,返回负整数、零或正整数。并且只能与相同枚举类型的其他枚举常量进行比较。publicfinalintcompareTo(Eo){Enumother=(Enum)o;枚举self=this;if(self.getClass()!=other.getClass()self.getDeclaringClass()!=other.getDeclaringClass())thrownewClassCastException();returnself.ordinal-other.ordinal;}```//返回这个枚举常量的枚举类型对应的Class对象。publicfinalClassgetDeclaringClass(){Classclazz=getClass();类zuper=clazz.getSuperclass();返回(zuper==Enum.class)?(Class)clazz:(Class)zuper;}```}底层原理enum的语法结构对于普通Java来说可能看起来很奇怪,但是用编译器编译后会生成一个.class文件,可以理解枚举的语法结构是一种规范,可以让编译器识别并转换成对应的类,底层其实就是一个类。publicclasscom.project.demo.Colourextendsjava.lang.Enum{publicstaticfinalcom.project.demo.ColourRED;publicstaticfinalcom.project.demo.ColourYELLOW;公共静态最终com.project.demo.ColourBLUE;publicstaticfinalcom.project.demo.ColourGREEN;static{};}总结所以enum在Java中其实是以类的形式存在的,它可以帮助我们更方便的定义常量对象,并且支持属性和方法的定义,一定程度上提高了我们的编程效率。但是在使用的时候需要注意,enum不支持继承,应该是继承了包中的java.lang.Enum类,所以我们在设计程序的时候需要考虑到。