枚举类Enum反编译后效果

原代码

java 复制代码
// Singleton.java
public enum Singleton {
    INSTANCE;
    
    private String data = "Hello World";
    
    public void doSomething() {
        System.out.println("Doing something with: " + data);
    }
}

反编译后的结果

java 复制代码
// 反编译后的 Singleton 类
public final class Singleton extends java.lang.Enum<Singleton> {
    
    // 枚举实例 - 静态final常量
    public static final Singleton INSTANCE;
    
    
    // 静态代码块 - 在类加载时初始化枚举实例
    static {
        // 创建枚举实例,传入名称和序号
        INSTANCE = new Singleton("INSTANCE", 0);
        
        // 将所有枚举值放入数组
        $VALUES = new Singleton[]{INSTANCE};
    }

    // 私有字段
    private String data;
    
    // 私有构造方法 - 这是关键!
    private Singleton(String name, int ordinal) {
        // 调用父类Enum的构造方法
        super(name, ordinal);
        // 初始化实例字段
        this.data = "Hello World";
    }
    
    // 我们自定义的方法
    public void doSomething() {
        System.out.println("Doing something with: " + this.data);
    }

    
    // 自动生成的方法 - 获取所有枚举值
    public static Singleton[] values() {
        return (Singleton[])$VALUES.clone();
    }
    
    // 自动生成的方法 - 通过名称获取枚举值
    public static Singleton valueOf(String name) {
        return (Singleton)java.lang.Enum.valueOf(Singleton.class, name);
    }

    
    // 内部使用的数组
    private static final Singleton[] $VALUES;
}

为什么枚举是完美的单例

java 复制代码
1、final 类 - 无法被继承

public final class Singleton extends java.lang.Enum<Singleton>
// final 修饰符防止被继承,保护单例完整性


2、私有构造方法 - 防止外部实例化

private Singleton(String name, int ordinal)
// 构造方法是私有的,且接受两个参数(名称和序号)
// 这解释了为什么不能通过反射创建枚举实例:
// 反射需要知道确切的参数类型,但枚举的构造器是特殊的



3、静态代码块初始化 - 线程安全
static {
    INSTANCE = new Singleton("INSTANCE", 0);
    $VALUES = new Singleton[]{INSTANCE};
}
// JVM 保证静态代码块的线程安全
// 枚举实例在类加载时创建,且只创建一次


4、特殊的序列化处理
枚举的序列化机制是特殊的:
序列化时:只写入枚举的名称
反序列化时:通过 valueOf()方法根据名称获取已有的枚举实例
这保证了反序列化后仍然是同一个实例
相关推荐
程序喵大人3 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng4 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena157795857924 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
wdfk_prog5 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕5 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫5 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通6 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦7 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派7 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit7 小时前
Java+Ai+vue
java·spring·maven