如何快速掌握 Java 枚举类型的定义和使用场景!

news2024/11/20 12:18:20

Java枚举类型(Enum)是一种特殊的类,用于表示一组固定的常量。枚举类型在Java 5中引入,通过 enum 关键字来定义。枚举类型不仅可以使代码更具可读性,还能增加类型安全性并减少错误。

一、枚举类型的定义

枚举类型通过 enum 关键字定义,其基本形式如下:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

上述代码定义了一个名为 Day 的枚举类型,包含七个枚举常量,分别代表一周的每一天。

1.1 基本枚举类型

枚举类型可以直接使用,就像使用常量一样。例如:

Day day = Day.MONDAY;
System.out.println(day); // 输出:MONDAY
1.2 枚举中的方法

每个枚举类型隐式地继承了 java.lang.Enum 类,且不能显式继承其他类(Java是单继承语言)。 Enum 类提供了几个有用的方法:

  • name(): 返回枚举常量的名称。
  • ordinal(): 返回枚举常量的序数(从0开始)。
  • values(): 返回包含所有枚举常量的数组。

示例代码:

for (Day day : Day.values()) {
    System.out.println(day.name() + " at index " + day.ordinal());
}

二、枚举类型的使用场景

2.1 替代常量

在没有枚举之前,我们通常使用 public static final 常量来表示一组固定的值。枚举类型提供了更好的替代方案,因为它们更具类型安全性和可读性。例如:

public class Constants {
    public static final int SUNDAY = 0;
    public static final int MONDAY = 1;
    // ...
}

int today = Constants.MONDAY;

使用枚举:

Day today = Day.MONDAY;
2.2 复杂逻辑的封装

枚举类型不仅可以包含常量,还可以包含字段、方法和构造器。这样可以将复杂的逻辑封装在枚举类型中。例如,假设我们有一个季节的枚举类型,并且每个季节有不同的天气描述:

public enum Season {
    SPRING("Cool"), SUMMER("Hot"), AUTUMN("Mild"), WINTER("Cold");

    private String description;

    private Season(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

使用枚举:

Season season = Season.SUMMER;
System.out.println(season.getDescription()); // 输出:Hot
2.3 实现接口

枚举类型可以实现接口,这使得枚举类型更加灵活。例如,假设我们有一个操作接口,并且我们希望每个枚举常量实现不同的操作:

public interface Operation {
    double apply(double x, double y);
}

public enum BasicOperation implements Operation {
    PLUS("+") {
        public double apply(double x, double y) { return x + y; }
    },
    MINUS("-") {
        public double apply(double x, double y) { return x - y; }
    },
    TIMES("*") {
        public double apply(double x, double y) { return x * y; }
    },
    DIVIDE("/") {
        public double apply(double x, double y) { return x / y; }
    };

    private final String symbol;

    BasicOperation(String symbol) {
        this.symbol = symbol;
    }

    @Override
    public String toString() {
        return this.symbol;
    }
}

使用枚举:

double result = BasicOperation.PLUS.apply(1, 2);
System.out.println(result); // 输出:3.0

三、枚举的高级用法

3.1 枚举中的抽象方法

可以在枚举中定义抽象方法,并由每个枚举常量来实现。例如:

public enum Operation {
    PLUS {
        @Override
        public double apply(double x, double y) {
            return x + y;
        }
    },
    MINUS {
        @Override
        public double apply(double x, double y) {
            return x - y;
        }
    };

    public abstract double apply(double x, double y);
}
3.2 枚举与Switch语句

枚举类型可以与 switch 语句一起使用,使代码更加清晰。例如:

Day day = Day.MONDAY;
switch (day) {
    case MONDAY:
        System.out.println("Monday");
        break;
    case TUESDAY:
        System.out.println("Tuesday");
        break;
    // ...
    default:
        System.out.println("Other day");
        break;
}
3.3 枚举中的静态方法

可以在枚举类型中定义静态方法。例如:

public enum Utility {
    ;

    public static boolean isWeekend(Day day) {
        return day == Day.SATURDAY || day == Day.SUNDAY;
    }
}

Day today = Day.SATURDAY;
System.out.println(Utility.isWeekend(today)); // 输出:true

四、枚举类型的优点

  1. 类型安全性:枚举类型提供了编译时检查,防止传递无效的值。
  2. 可读性:枚举常量的名称比整数常量更具描述性,代码更加清晰。
  3. 功能强大:枚举类型不仅可以包含常量,还可以包含字段、方法和实现接口。
  4. 减少错误:使用枚举可以防止很多常见的编程错误,例如传递无效的常量值。

五、枚举类型的局限性

尽管枚举类型在很多场景下非常有用,但它们也有一些局限性:

  1. 不可变性:枚举常量是不可变的,不能动态添加或删除枚举常量。
  2. 额外开销:每个枚举常量都是一个实例,可能会增加内存开销。
  3. 序列化问题:枚举类型的序列化在不同的Java版本中可能会有所不同,使用时需谨慎。

六、枚举类型的实际应用示例

下面是一个使用枚举类型的实际应用示例,展示如何在实际项目中使用枚举来管理状态和行为。

假设我们有一个订单系统,需要表示订单的状态,并根据不同的状态执行不同的操作。

public enum OrderStatus {
    NEW {
        @Override
        public void handle() {
            System.out.println("Handling new order");
        }
    },
    PROCESSING {
        @Override
        public void handle() {
            System.out.println("Processing order");
        }
    },
    SHIPPED {
        @Override
        public void handle() {
            System.out.println("Order shipped");
        }
    },
    DELIVERED {
        @Override
        public void handle() {
            System.out.println("Order delivered");
        }
    };

    public abstract void handle();
}

使用枚举:

OrderStatus status = OrderStatus.NEW;
status.handle(); // 输出:Handling new order

status = OrderStatus.SHIPPED;
status.handle(); // 输出:Order shipped

Java枚举类型是一种功能强大且灵活的工具,可以有效地替代常量,提高代码的可读性和类型安全性。枚举类型不仅可以表示一组固定的常量,还可以包含字段、方法和实现接口,封装复杂的逻辑。尽管枚举类型有一些局限性,但在大多数场景下,它们都是一种极为有用的编程手段。通过合理使用枚举类型,可以显著提高代码质量和开发效率。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1811251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型训练的10个调试技巧

几年前,Andrej Karpathy 写了一篇关于训练神经网络的很棒的文章。以下是我在实施过程中遵循的一些额外事项,侧重于调试大型语言模型。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 -…

程序猿大战Python——流程控制——其他控制语句

for循环 目标:掌握for循环的使用。 与while循环功能类似,for语句也能完成反复多次的执行。 for语法: for 临时变量 in 序列:满足条件时,执行的代码1满足条件时,执行的代码2…… [else:当for循环正常执行结束后&#…

基于PHP+MySQL组合开发的商城小程序源码系统 附带完整的安装代码包以及搭建教程

系统概述 该商城小程序源码系统采用PHP作为后端开发语言,MySQL作为数据库存储引擎,这是一套成熟且广泛应用的技术组合,能够确保系统的稳定性和扩展性。前端部分则利用Vue.js等现代前端框架实现动态交互,保证用户体验的流畅性。 …

Java | Leetcode Java题解之第141题环形链表

题目: 题解: public class Solution {public boolean hasCycle(ListNode head) {if (head null || head.next null) {return false;}ListNode slow head;ListNode fast head.next;while (slow ! fast) {if (fast null || fast.next null) {return…

人工智能对聊天机器人训练数据的“淘金热”可能会耗尽人类编写的文本

人工智能对聊天机器人训练数据的“淘金热”可能会耗尽人类编写的文本 像ChatGPT这样的人工智能系统可能很快就会耗尽让它们变得更聪明的东西——人们在网上写下和分享的数万亿字。 Epoch AI研究集团发布的一项新研究预计,科技公司将在大约十年之交——2026年至203…

SpringBoot + Maven

文章目录 1、Maven2、SpringBoot3、二者之间的联系4、项目的创建 在创建项目之前,肯定要知道他们之间的区别 1、Maven maven是一个跨平台的项目管理工具。它是Apache的一个开源项目,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。 比如说…

cordic IP核中,sin and cos的使用

参考视频:FPGA IP之CORDIC_哔哩哔哩_bilibili FPGA IP之CORDIC使用与仿真_哔哩哔哩_bilibili 一、参数说明 functional selection rotate是旋转,sin and cos是计算这两个三角函数,sinh和cosh是计算双曲正弦和双曲余弦 phase format 对于…

Databricks超10亿美元收购Tabular;Zilliz 推出 Milvus Lite ; 腾讯云支持Redis 7.0

重要更新 1. Databricks超10亿美元收购Tabular,Databricks将增强 Delta Lake 和 Iceberg 社区合作,以实现 Lakehouse 底层格式的开放与兼容([1] [2])。 2. Zilliz 推出 Milvus Lite 轻量级向量数据库,支持本地运行;Milvus Lite 复…

【Go语言】面向对象编程(一):类的定义、初始化和成员方法

面向对象编程(一):类的定义、初始化和成员方法 1 类的定义和初始化 Go 语言的面向对象编程没有 class 、 extends 、implements 之类的关键字和相应的概念,而是借助结构体来实现类的声明,如下是定义一个学生类的方法…

2024年【危险化学品经营单位主要负责人】免费试题及危险化学品经营单位主要负责人证考试

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人免费试题根据新危险化学品经营单位主要负责人考试大纲要求,安全生产模拟考试一点通将危险化学品经营单位主要负责人模拟考试试题进行汇编,组成一套危险化学品经营…

镜舟科技与喆塔科技签署战略合作协议,共拓工业领域数据应用

近日,镜舟科技与喆塔科技正式签署战略合作协议,旨在通过双方的深度合作,共同推动工业领域企业级数据分析与智能制造的融合创新,携手为行业客户提供更加精准、高效的数据驱动解决方案。 镜舟科技 CEO 孙文现与喆塔科技 CEO 赵文政出…

12.文件

知识点一:文件的存取过程 缓冲区的目的:提高存储效率磁盘使用寿命 知识点二:磁盘文件分类 物理上所有的磁盘文件都是二进制存储,以字节为单位顺序存储 逻辑上的文件分类: 文本文件:基于字符编码的文件,如ASCII、UNICO…

04. fastLED像素参考(颜色设置详解)

fastLED像素参考 原文 Overview 概述 There’s two main pixel types in the library - the CRGB class and the CHSV class. CHSV objects have to be converted to CRGB objects before they can be written out. You can also write CHSV objects into the CRGB array an…

QT6 学生管理系统以及登录(QSQLITE数据库)

一、准备工具以及环境 本文采用的是QT Creator6.5.3版本,代码基于C语言,文中所用到的数据库是QSQLITE库。 因为做的是一个简单的学生管理系统,所以只是做到了简单的对数据库进行增删改查等操作,以及一个简单的登录界面。 二、U…

wgcloud可以监测交换机的哪些数据

WGCLOUD可以监测交换机的cpu,内存,温度,电压,磁盘,流量传输速率等数据 WGCLOUD也是基于SNMP协议来监测交换机的

进口自力式蒸汽减压阀-美国品牌

进口自力式蒸汽减压阀是一种用于蒸汽系统中,通过自身能量来调节和控制蒸汽压力的装置。以下是关于进口自力式蒸汽减压阀的详细回答: 定义与功能: 进口自力式蒸汽减压阀是一种无需外加能源,利用被调介质(蒸汽&#xff…

每日一题——Python实现PAT乙级1104 天长地久(举一反三+思想解读+逐步优化)七千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 点评 时间复杂度分析 空间复杂度分析 综合分析 我要更强 时间复杂度分…

VitePress+Docker+jenkins构建个人网站

VitePress官网 VitePress | 由 Vite 和 Vue 驱动的静态站点生成器 可以理解为一个前端脚手架:快速生成个人站点 最好先大概看一遍 快速开始 | VitePress 可以在线体验一下 安装条件 node -v 检查下node版本 在D盘创建一个文件夹 例如:VitePress 进入文件夹 cmd npm ini…

一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线

亚信安全联合鼎捷软件股份有限公司(以下简称“鼎捷软件”)正式推出“一键安全体检”服务。亚信安全网络安全专家将携手鼎捷软件数据安全专家,围绕企业的数智安全状况,进行问题探索与治愈、新问题预测与预警,在全面筛查…

一文入门vim

先来波快问快答。 第一个问题,vim是什么? vim就是一文本编辑器。 第二个问题,我们为什么要使用vim? 好像在终端中可选择使用的文本编辑器也不多(其他有,但是相对而言vim用的比较广泛) 第三…