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 领取,更多内容陆续奉上。

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

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

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

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