0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你知道Java中枚举的这些神仙用法吗?

冬至子 来源:JAVA旭阳 作者:JAVA旭阳 2023-06-05 11:44 次阅读

概述

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上。

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

枚举常见用途

枚举创建单例

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

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(1, 2) {
        @Override
        public Integer operate() {
            return this.getA() + this.getB();
        }
    }, MULTIPY(1, 2) {
        @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;
    }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104758
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    20095
收藏 人收藏

    评论

    相关推荐

    C语言中枚举的基本概念和常见用法

    在C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言枚举的基本概念、语法和用法,以及一些高级技巧。
    发表于 08-17 15:32 1467次阅读

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程相比,多线程可以提高程序的并发性和响应
    的头像 发表于 09-30 17:07 953次阅读

    智能五笔:另类用法技巧知道吗?

    智能五笔:另类用法技巧知道吗? 智能五笔是很多朋友都喜欢使用的一种五笔输入法,不过如果只是将其作为一款普通的输入法来使用的话,那
    发表于 02-24 13:49 658次阅读

    深入理解java枚举类型enum用法

    enum 的全称为 enumeration, 是 JDK 1.5 引入的新特性,存放在 java.lang 包。 下面是我在使用 enum 过程的一些经验和总结。 原始的接口定义
    发表于 09-27 11:49 0次下载

    java并发编程实战之辅助类用法

    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore2017-09-18 13:07程序设计/58 在java 1.5,提供了一些非常有用的辅助类来帮助
    发表于 09-27 16:50 0次下载

    基于STM32的多种printf用法 知道吗?

    基于STM32的多种printf用法知道吗?
    的头像 发表于 02-29 17:02 4489次阅读

    go语言枚举类型怎么用

    java 等,都有原生支持。在 go ,大家却找不到 enum 或者其它直接用来声明枚举类型的关键字。从熟悉其它编程语言的开发者转用 go 编程,刚开始会比较难接受这种情况。其实,如果
    的头像 发表于 09-02 09:43 5184次阅读

    示波器的这些安全操作知道吗?

    示波器的这些安全操作知道吗?示波器维修。很多人都知道示波器是用来干什么的,也知道示波器都有哪些种类和品牌,当然也
    发表于 11-05 11:19 1698次阅读

    SystemVerilog枚举类型的使用建议

    SystemVerilog枚举类型虽然属于一种“强类型”,但是枚举类型还是提供了一些“不正经”的用法可以实现一些很常见的功能,本文将示例一些在枚举
    的头像 发表于 09-01 14:20 1719次阅读

    如何正确区分Javasuper函数用法

    Javasuper函数有很多方法,在使用的时候我们应该如何正确区分? 2 方法 三种用法: 访问父类的方法。 调用父类构造方法。 访问父类的隐藏成员变
    的头像 发表于 02-21 15:08 570次阅读

    Java创建对象有哪些方式

    1 问题 作为Java开发者,经常创建很多对象,是否知道Java创建对象有哪些方式呢?
    的头像 发表于 02-24 10:29 1053次阅读

    Java枚举的特点及用法

    Java 枚举出现之前,通常会使用常量类来表示一组固定的常量值,直到Java 1.5之后推出了枚举,那么枚举类型有哪些特点,它比常量类又
    的头像 发表于 09-30 10:02 1452次阅读

    javaobj类型的实战用法

    类型具有许多实战用法,下面将详细介绍一些常见的使用场景。 作为方法参数和返回值的类型 在Java,可以使用obj类型作为方法的参数或返回值类型。这种用法可以使方法具有更广泛的适用性,
    的头像 发表于 11-21 10:27 773次阅读

    java switch case值能为枚举值吗

    Java的switch语句可以接受枚举类型的值作为参数。在Java枚举是一种特殊的数据类型
    的头像 发表于 11-30 14:41 5403次阅读

    Java 枚举与策略模式、函数式接口的结合:实现高内聚低耦合的设计

    作者:京东物流 杨唯一 一、Java 枚举Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 天,方向有东南西北等。 我们
    的头像 发表于 11-21 14:06 212次阅读