JAVA中枚举类型(Enum)的本质

本文详细讲解了Java枚举如何在单例模式中发挥作用,通过实例和编译分析揭示其天生线程安全的特性。重点讨论了枚举作为final类和静态常量的特性,以及在多线程环境中的应用。

JAVA中提供了枚举这种类型,枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中。此外,枚举类型还提供了安全检查功能。

在以前学习单例设计模式时,可以使用枚举来实现单例模式。那么枚举的本质是什么呢?

枚举在单例模式中的使用:

public enum SingleEnum {
    INSTANCE;

    SingleEnum() {
        System.out.println("init SingleEnum");
    }

    public static void staticMethod() {
        System.out.println("static method");
    }
}

枚举单例在多线程环境的测试:

public class SingleEnumTest {
    @Test
    public void values() {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                System.out.println(SingleEnum.INSTANCE.hashCode());
            }).start();
        }
    }
}

测试结果:

init SingleEnum
548807905
548807905
548807905
548807905
548807905
548807905
548807905
548807905
548807905
548807905

测试发现,SingleEnum是线程安全的单例。

那么Enum为什么可以天然支持单例?

使用javac命令编译SingleEnum.java,再使用javap命令查看java编译器为我们生成的SingleEnum的字节码。

通过这个我们可以发现,枚举类在编译过之后,其实是final class,原Enum中的枚举值是作为public staic final xxx静态常量值存在的,在类加载时生产了唯一的实例,并且由JVM天然的保证了线程的安全性。

结论:枚举类型最终还是以类的形式存在,枚举类中的枚举值是以类的静态常量的方式存在。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值