Redian新闻
>
公司新来一个同事,把枚举运用得炉火纯青...

公司新来一个同事,把枚举运用得炉火纯青...

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:JAVA旭阳


Java中的枚举,大家在项目中经常使用吧,主要用来定义一些固定值,在一个有限的集合内,比如在表示一周的某一天,一年中的四季等。那你了解枚举的本质吗,或者说底层是什么样的?了解枚举的一些神仙用法吗?

枚举主要用来定义一个有限集合内的固定值。

枚举定义方式如下:

// 简单的定义
enum WeekEnum {
    MONDAY, TUESDAY
}

// 有属性的定义
enum StatusEnum {
    ENABLE("1""启用"), DISABLE("0""禁用");

    private String code;

    private String name;

    StatusEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }
}

枚举编译后实际上继承了java.lang.Enum这个类,后面详细讲解,我们看下这个类的关键方法:

  • static Enum valueOf(Class enumClass, String name)

返回指定名字、给定类的枚举常量

  • String toString()

返回枚举常量名

  • int ordinal()

返回枚举常量在enum中的位置,从0开始

  • int compareTo(E other)

如果枚举场景出现在other之前,则返回一个负值,如果this == other,则返回0,否则返回正值。

public static void main(String[] args) {
        // 根据字符串获取枚举
        StatusEnum enable = Enum.valueOf(StatusEnum.class, "ENABLE");
        System.out.println(enable);
        //枚举比较直接用==
        System.out.println(enable == StatusEnum.ENABLE);

        // values方法获取所有的枚举
        StatusEnum[] values = StatusEnum.values();
        for (StatusEnum statusEnum : values) {
            // 打印枚举的位置
            System.out.println(statusEnum.ordinal());
        }
    }

运行结果:

枚举的本质

枚举的本质其实是一个类,继承了java.lang.Enum这个类。我们可以用idea的插件看下生成的字节码如下:

  1. 继承了java.lang.Enum
  1. ENABLE、DISABLE最终转换为静态字段,类型其实StatusEnum这个类
  1. 类加载的时候初始化ENABLE、DISABLE这两个属性。

方法是类加载的初始化阶段就是执行的,它这里的主要逻辑就是创建了两个对象,设置到ENABLE,DISABLE上。

这下你明白枚举是怎么一会事情了吧。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

枚举常见用途

枚举创建单例

枚举可以作为单例模式的最佳方式,能够保证单例对象的唯一性。

public class User {
    //私有化构造函数
    private User(){ }
 
    //定义一个静态枚举类
    static enum SingletonEnum{
        //创建一个枚举对象,该对象天生为单例
        INSTANCE;
        private User user;
        //私有化枚举的构造函数
        private SingletonEnum(){
            user = new User();
        }
        public User getInstnce(){
            return user;
        }
    }
 
    //对外暴露一个获取User对象的静态方法
    public static User getInstance(){
        return SingletonEnum.INSTANCE.getInstnce();
    }
}
  • 枚举INSTANCE会在类加载初始化的时候创建,而Java类的加载和初始化过程都是线程安全的。
  • 枚举可避免反序列化破坏单例。

枚举抽象方法

枚举类可以定义抽象方法,然后让各个具体的枚举实现,可以通过枚举实现不同的策略实现。

enum OperEnum {
    ADD(12) {
        @Override
        public Integer operate() {
            return this.getA() + this.getB();
        }
    }, MULTIPY(12) {
        @Override
        public Integer operate() {
            return this.getA() * this.getB();
        }
    };

    private Integer a;

    private Integer b;

    OperEnum(Integer a, Integer b) {
        this.a = a;
        this.b = b;
    }

    public abstract Integer operate();

    public Integer getA() {
        return a;
    }

    public void setA(Integer a) {
        this.a = a;
    }

    public Integer getB() {
        return b;
    }

    public void setB(Integer b) {
        this.b = b;
    }
}


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
住建系统为保交楼资金开辟新来源内幕曝光!加拿大校园成“毒窝”,各种潜规则不胜枚举!留学生成重点对象,小学生都不放过!这个同济学霸66门课满绩!还会造船……B站成立交易生态中心;选秀爱豆利路修等入淘开播;小红书旗下公司新增AI软件开发业务 | 一周简讯大多伦多12个同事合买彩票十年!在Hwy7加油站买的中了大奖“同事在我对面看颜色小视频?”奇葩同事别太荒谬...都快想退休了,才发现/觉得我入错行了!结婚十年后,把老公熬成爹,把奶狗熬成哥来了!来了!COSTCO护肤类的清仓上新来了,颈霜,乳液,眼霜等都有福利空巢日记摘要2005中国银行(澳大利亚)有限公司新客尊享:开立网银活期账户+激活借记卡,最高可享存款账户利率5.50%p.a.【CSSA招新】技术热血沸腾,IT部招新来袭!新来了个同事,代码命名规范是真优雅呀!代码如诗!!价格战升级!这家电信公司新推比对手低20%手机计划纽约市每天花费1000万照顾无证移民 新来的人:“这里很混乱 和想象的美国不一样”思想的多样性:运用正态分布,投资顶级公司公司新入职一位大佬,把SpringBoot项目启动时间从7分钟降到了40秒!刘强东又少了个同龄兄弟如何高效优雅的使用java枚举期货公司新规落地在即,或开启行业增资潮川普或以独立人身份参选中美直飞航班增加! 多航司新增洛杉矶赴华航线,但票价仍会上涨你的下一个同事,又何必是人类?新来个技术总监,给公司项目引入了全新的业务架构,堪称最佳实践!“救命,印度同事在厕所...”澳华人撞见美女同事做这事,吓到不敢出声无论在哪上班:永远别逼疯同事,永远别被同事逼疯机票限时九折!加航推出“新来加人士计划” 还有宠物优惠!一张表,了解大奖的世界文革记忆 -- 红小兵追疯子赴华:中东航司新开线路!美国回京公务舱往返2476美元~欧洲、非洲回国也可以看看中美增航后,中国航司新增的中美航班还是避开了俄罗斯领空...小心!大温华人最爱的这活动 BC有4个同胞被罚17000刀!一心捞钱、草菅人命,湖南湘雅医院呼吸科美女主任被9个同事联名举报如果重新来过,你还会做同样的选择吗?规培“两个同等对待”,西安在入编招聘中落实了!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。