枚举类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()方法根据名称获取已有的枚举实例
这保证了反序列化后仍然是同一个实例
相关推荐
初恋叫萱萱22 分钟前
构建高性能生成式AI应用:基于Rust Axum与蓝耘DeepSeek-V3.2大模型服务的全栈开发实战
开发语言·人工智能·rust
cyforkk1 小时前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试
我材不敲代码5 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
身如柳絮随风扬6 小时前
Java中的CAS机制详解
java·开发语言
韩立学长8 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
风筝在晴天搁浅8 小时前
hot100 78.子集
java·算法
froginwe118 小时前
Scala 循环
开发语言
m0_706653238 小时前
C++编译期数组操作
开发语言·c++·算法
故事和你918 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Bruk.Liu8 小时前
(LangChain实战2):LangChain消息(message)的使用
开发语言·langchain