百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Java枚举你真的会用吗_java枚举怎么使用

liuian 2025-09-04 11:59 4 浏览

概述

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;
    }
}

总结

本文主要讲解了枚举的本质,以及枚举的常见用法,希望对你们有帮助。

相关推荐

C语言学习从内存堆栈视角,给这段枚举代码做个 "内存透视"

从内存堆栈视角,给这段枚举代码做个"内存透视"#include<stdio.h>enumDAY{MON=1,TUE,WED,THU,FR...

Python基础:枚举,都有哪些特点和使用场景呢?

在Python编程语言中,枚举(Enumeration)是一种特殊的类,用于为一组常量创建一个名称空间。枚举类在Python3.4中被引入,提供了一种更加直观和方便的方式来处理一组相关的常量。枚举类...

Java枚举你真的会用吗_java枚举怎么使用

概述Java中枚举,大家在项目中经常使用吧,主要用来定义一些固定值,在一个有限的集合内,比如在表示一周的某一天,一年中的四季等。那你了解枚举的本质吗?了解枚举的一些常见用法吗?枚举介绍和使用枚举主要用...

反射、枚举以及Lambda表达式_反射getmethod

一、反射1.定义Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我们就...

一个高效使用cursor开发项目的方法,怎么让 AI 写的代码不跑题?

最近又用cursor做了一个小应用,番茄时钟,用来管理自己的时间,提高效率。然后使用cursor开发的过程中。有了一些新的感悟。找到了一条可以让Curosr不跑题的办法。生成一份详细的项目资...

前端铜九铁十面试必备八股文——工程化

常用的git命令gitclone:克隆远程仓库到本地。gitinit:在当前目录初始化一个新的Git仓库。gitadd:将文件添加到暂存区,准备提交。gitcommit-m"co...

IntelliJ IDEA 2025.2 的主要更新亮点

以下是该版本的一些关键改进与功能更新:AI增强体验离线Java代码补全:AI助手现在支持在离线模式下进行Java代码块建议,并允许用户选择本地代码模型使用。AIAssistant新增...

一行命令,AI 直接写代码!OpenAI 正式发布 Codex CLI

【一句话速读】OpenAI把2021年的Codex品牌复活,推出全新CodexCLI——一个本地运行的轻量级编码代理。只需npmi-g@openai/codex,它就能在终端里帮...

如何使用高级TypeScript模式构建可扩展的QA框架

TypeScript自动化QA(7部分系列)TypeScript第一步:自动化QA实用路线图如何在TypeScript中使用数组和对象构建强大的QA自动化脚本如何掌握TypeScript基础...

Bun JS工具包新增MySQL驱动和密钥管理功能

Bun团队发布了其JavaScript打包器和运行时的1.2.21版本,该工具使用Zig语言编写,新增了包括MySQL和SQLite内置驱动、YAML解析器以及用于工具和本地开发的密钥管理器等功能。新...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理...

一文说明,TypeScript 的装饰器_typescript logo

●装饰器(Decorators)●注意:装饰器目前是一项实验性特性,在未来的版本中可能会发生改变●装饰器一般使用在以下几个地方○类○类属性○类方法○类方法的参数○通过这些我们也能看得出来,...

前端小哥哥:如何使用typescript开发实战项目?

前言笔者上一篇文章:主要写了typescript的用法和核心知识点总结,这篇文章将通过一个实际的前端案例来教大家如何在项目中使用typescript.你将收获如何使用umi快速搭建一个基于React...

一篇文章搞懂TypeScript_typescript implements

TypeScript是JavaScript的超集,一方面给动态类型的js增加了类型校验,另一方面扩展了js的各种功能。原始数据类型字符串数值布尔nullundefinedSymbolBi...

TypeScript的any和unknown,用错一个就是线上Bug

在TypeScript开发中,类型系统是我们抵御运行时错误的第一道防线。但两个特殊类型——any和unknown,却常常被误用,成为线上故障的隐形推手。本文通过真实案例解析,告诉你为什么unknown...