JDK源码Enum类原理及代码实例解析
正文
一概述
枚举类型是JDK5之后引进的一种非常重要的引用类型,可以用来定义一系列枚举常量,使用enum来表示枚举可以更好地保证程序的类型安全和可读性
实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了JavaAPI中的java.lang.Enum类,
也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类
使用举例
publicclassEnumTest{ enumMyCode{ ONE("1","编码一"), TWO("2","编码二"); privateStringcode; privateStringname; MyCode(Stringcode,Stringname){ this.code=code; this.name=name; } } publicstaticvoidmain(String[]args){ //获取一个枚举实例 MyCodeone=MyCode.valueOf(MyCode.class,"ONE"); //可以调用Enum类中的实例方法 one.compareTo(MyCode.TWO); } }
二源码分析
publicabstractclassEnum> implementsComparable ,Serializable{ //枚举常量的名称 privatefinalStringname; //返回此枚举常量的名称,与其枚举声明中声明的完全相同 publicfinalStringname(){ returnname; } //此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零) privatefinalintordinal; //返回序号 publicfinalintordinal(){ returnordinal; } //构造器 protectedEnum(Stringname,intordinal){ this.name=name; this.ordinal=ordinal; } //返回声明中包含的此枚举常量的名称 publicStringtoString(){ returnname; } //果指定的对象等于此枚举常量,则返回true。 publicfinalbooleanequals(Objectother){ returnthis==other; } publicfinalinthashCode(){ returnsuper.hashCode(); } //无法被克隆 protectedfinalObjectclone()throwsCloneNotSupportedException{ thrownewCloneNotSupportedException(); } //将此枚举与指定的枚举序号进行比较 publicfinalintcompareTo(Eo){ Enum>other=(Enum>)o; Enum self=this; if(self.getClass()!=other.getClass()&&//optimization self.getDeclaringClass()!=other.getDeclaringClass()) thrownewClassCastException(); returnself.ordinal-other.ordinal; } //返回与此枚举常量的枚举类型相对应的Class对象 @SuppressWarnings("unchecked") publicfinalClass getDeclaringClass(){ Class>clazz=getClass(); Class>zuper=clazz.getSuperclass(); return(zuper==java.lang.Enum.class)?(Class )clazz:(Class )zuper; } /** *返回具有指定名称的指定枚举类型的枚举常量。 *该名称必须与用于声明此类型的枚举常量的标识符完全一致。 *请注意,对于特定枚举类型T, *有两个隐式声明方法可以直接使用: *publicstaticTvalueOf(String)根据名称获取单个枚举类型 *publicstaticT[]values()获取所有枚举类型数组 */ publicstatic >TvalueOf(Class enumType, Stringname){ Tresult=enumType.enumConstantDirectory().get(name); if(result!=null) returnresult; if(name==null) thrownewNullPointerException("Nameisnull"); thrownewIllegalArgumentException( "Noenumconstant"+enumType.getCanonicalName()+"."+name); } //枚举类不能有finalize方法 protectedfinalvoidfinalize(){} //防止反序列化 privatevoidreadObject(ObjectInputStreamin)throwsIOException, ClassNotFoundException{ thrownewInvalidObjectException("can'tdeserializeenum"); } privatevoidreadObjectNoData()throwsObjectStreamException{ thrownewInvalidObjectException("can'tdeserializeenum"); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。