JDK源码Enum类原理及代码实例解析
#代码知识 发布时间: 2026-01-12
正文

一 概述
枚举类型是 JDK 5 之后引进的一种非常重要的引用类型,可以用来定义一系列枚举常量,使用 enum 来表示枚举可以更好地保证程序的类型安全和可读性
实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,
也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类
使用举例
public class EnumTest {
enum MyCode{
ONE("1","编码一"),
TWO("2","编码二");
private String code;
private String name;
MyCode(String code, String name) {
this.code = code;
this.name = name;
}
}
public static void main(String[] args) {
// 获取一个枚举实例
MyCode one = MyCode.valueOf(MyCode.class, "ONE");
// 可以调用Enum类中的实例方法
one.compareTo(MyCode.TWO);
}
}
二 源码分析
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//枚举常量的名称
private final String name;
//返回此枚举常量的名称,与其枚举声明中声明的完全相同
public final String name() {
return name;
}
//此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)
private final int ordinal;
//返回序号
public final int ordinal() {
return ordinal;
}
// 构造器
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
//返回声明中包含的此枚举常量的名称
public String toString() {
return name;
}
//果指定的对象等于此枚举常量,则返回true。
public final boolean equals(Object other) {
return this==other;
}
public final int hashCode() {
return super.hashCode();
}
// 无法被克隆
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
//将此枚举与指定的枚举序号进行比较
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
//返回与此枚举常量的枚举类型相对应的Class对象
@SuppressWarnings("unchecked")
public final Class<E> getDeclaringClass() {
Class<?> clazz = getClass();
Class<?> zuper = clazz.getSuperclass();
return (zuper == java.lang.Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;
}
/**
* 返回具有指定名称的指定枚举类型的枚举常量。
* 该名称必须与用于声明此类型的枚举常量的标识符完全一致。
* 请注意,对于特定枚举类型T ,
* 有两个隐式声明方法可以直接使用:
* public static T valueOf(String) 根据名称获取单个枚举类型
* public static T[] values() 获取所有枚举类型数组
*/
public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
//枚举类不能有 finalize 方法
protected final void finalize() { }
//防止反序列化
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
throw new InvalidObjectException("can't deserialize enum");
}
private void readObjectNoData() throws ObjectStreamException {
throw new InvalidObjectException("can't deserialize enum");
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
代码知识SEO上一篇 : js实现纯前端压缩图片
下一篇 : Python list和str互转的实现示例
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!