枚举的底层原理是什么?

本文详细介绍了Java中的枚举类型,包括枚举的定义、使用场景、内置方法,以及枚举的单例实现。枚举提高了代码可读性和可维护性,避免了使用int或String可能导致的错误。通过反编译,揭示了编译器如何为枚举生成内部结构,确保枚举的线程安全和唯一性。最后,文章强调了枚举在实现单例模式中的优势。
摘要由CSDN通过智能技术生成

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary

什么是枚举

枚举是JDK1.5新增的一种数据类型,是一种特殊的类,常用于表示一组常量,比如一年四季,12个月份,星期一到星期天,服务返回的错误码,结算支付的方式等等。枚举是使用enum关键字来定义。

枚举的使用

在使用枚举之前我们先探讨一个问题,为什么要使用枚举。

现在有个业务场景是结算支付,有支付宝和微信支付两种方式,1表示支付宝,2表示微信支付,还需要根据编码(1或2)获取相应的英文名,如果不用枚举,我们就要这样写。

public class PayTypeUtil {
   
    //支付宝
    private static final int ALI_PAY = 1;
    //微信支付
    private static final int WECHAT_PAY = 2;

    //根据编码获取支付方式的名称
    public String getPayName(int code) {
   
        if (ALI_PAY == code) {
   
            return "Ali_Pay";
        }
        if (WECHAT_PAY == code) {
   
            return "Wechat_Pay";
        }
        return null;
    }
}

如果这时,产品经理说要增加一个银联支付,就要加多if的判断,就会造成有多少种支付方式,就有多少个if,非常难看。

如果使用枚举,就变得很优雅,先看代码:

public enum PayTypeEnum {
   
    /** 支付宝*/
    ALI_PAY(1, "ALI_PAY"),
    /** 微信支付*/
    WECHAT_PAY(2, "WECHAT_PAY");

    private int code;

    private String describe;

    PayTypeEnum(int code, String describe) {
   
        this.code = code;
        this.describe = describe;
    }
    //根据编码获取支付方式
    public PayTypeEnum find(int code) {
   
        for (PayTypeEnum payTypeEnum : values()) {
   
            if (payTypeEnum.getCode() == code) {
   
                return payTypeEnum;
            }
        }
        return null;
    }
    //getter、setter方法
}

当我们需要扩展,只需要定义多一个实例即可,其他代码都不用动,比如加多一个银联支付。

/** 支付宝*/
ALI_PAY(1, "ALI_PAY"),
/** 微信支付*/
WECHAT_PAY(2, "WECHAT_PAY"),
//只需要加多一行代码即可完成扩展
/** 银联支付*/
UNION_PAY(3,"UNION_PAY");

一般在实际项目中,最多的写法就是这样,主要是简单明了,易于扩展。

第二种常见的用法是结合switch-case使用,比如我定义一个一年四季的枚举。

public enum Season {
   
    //春
    SPRING,
    //夏
    SUMMER, 
    //秋
    AUTUMN, 
    //冬
    WINTER;
}

然后结合switch使用。

public static void main(String[] args) throws Exception{
   
    doSomething(Season.SPRING);
}

private static void doSomething(Season season){
   
    switch (season){
   
        case SPRING:
            System.out.println("不知细叶谁裁出,二月春风似剪刀");
            break;
        case SUMMER:
            System.out.println("接天莲叶无穷碧,映日荷花别样红");
            break;
        case AUTUMN:
            System.out.println("停车坐爱枫林晚,霜叶红于二月花");
            break;
        case WINTER
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值