Java 枚举类的深入理解与应用

Java 的枚举类是一种特殊的类,通常表示一组常量。在编译或设计时,当我们知道所有变量的可能性时,尽量使用枚举类型。本文将通过一个具体的例子,深入探讨 Java 枚举类的定义、使用和高级特性。

目录

  • 枚举类的定义与使用
  • 枚举类的构造函数和字段
  • 枚举类的方法
  • 枚举类的高级特性
    • 枚举类实现接口
    • 特定于常量的方法实现
    • 使用枚举类封装数据

枚举类的定义与使用

Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。例如,我们可以定义一个表示 HTTP 响应状态的枚举类:

public enum HttpStatus {OK,NOT_FOUND,INTERNAL_SERVER_ERROR;
}

我们可以像使用普通的类一样使用枚举类。例如,我们可以创建一个 HttpStatus 类型的变量,并给它赋值:

HttpStatus status = HttpStatus.OK;
System.out.println(status);  // 输出结果为:OK


枚举类的构造函数和字段

在枚举类中,我们可以定义构造函数和字段。例如,我们可以为 HttpStatus 枚举类添加状态码和描述信息:

public enum HttpStatus {OK(200, "OK"),NOT_FOUND(404, "Not Found"),INTERNAL_SERVER_ERROR(500, "Internal Server Error");private final int code;private final String description;HttpStatus(int code, String description) {this.code = code;this.description = description;}public int getCode() {return code;}public String getDescription() {return description;}
}

在这个 HttpStatus 枚举类中,我们定义了两个私有字段 code 和 description,以及一个构造函数。每个枚举值 OK、NOT_FOUND、INTERNAL_SERVER_ERROR 在创建时都会调用这个构造函数,传入对应的状态码和描述信息。

枚举类的方法

我们可以在枚举类中定义方法。例如,我们在 HttpStatus 枚举类中定义了两个方法 getCode 和 getDescription,用于获取状态码和描述信息。

于是我们可以在程序中这样使用:

HttpStatus status1 = HttpStatus.OK;
HttpStatus status2 = HttpStatus.NOT_FOUND;
System.out.println(status1.getCode());  // 输出结果为:200
System.out.println(status2.getDescription());  // 输出结果为:"Not Found"


枚举类的高级特性

枚举类实现接口

枚举类可以实现一个或多个接口。这意味着枚举类可以定义方法,并且这些方法可以在枚举类的所有实例中共享。例如,我们可以让 HttpStatus 枚举类实现 Named 接口:

public enum HttpStatus implements Named {// ...
}interface Named {String getName();
}

在这个例子中,HttpStatus 枚举类实现了 Named 接口,所以它必须提供 getName 方法的实现。



特定于常量的方法实现

枚举类可以为每个枚举常量提供不同的方法实现。这是通过在枚举类中声明一个抽象方法,然后在特定于常量的类主体中,用具体的方法覆盖每个常量的抽象方法来实现的。例如:

public enum Operation {PLUS {@Overridepublic double apply(double x, double y) {return x + y;}},MINUS {@Overridepublic double apply(double x, double y) {return x - y;}};public abstract double apply(double x, double y);
}public class Main {public static void main(String[] args) {System.out.println(Operation.PLUS.apply(1, 2));  // 输出结果为:3.0System.out.println(Operation.MINUS.apply(5, 3));  // 输出结果为:2.0}
}

在这个例子中,Operation 枚举类定义了一个抽象的 apply 方法,然后 PLUS 和 MINUS 两个枚举常量分别提供了 apply 方法的实现。

使用枚举类封装数据

还是上面的例子,枚举类可以封装数据。每个枚举常量都可以有自己的数据字段,这些字段在构造枚举常量时初始化:

public enum Status {OK(200, "成功"),ERROR(500, "错误");private final int code;private final String message;Status(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}

在这个例子中,Status 枚举类有两个数据字段:code 和 message。每个枚举常量在创建时都会初始化这两个字段。

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

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

相关文章

【OJ】求和与计算日期

文章目录 1. 前言2. JZ64 求123...n2.1 题目分析2.2 代码 3. HJ73 计算日期到天数转换3.1 题目分析3.2 代码 4. KY222 打印日期4.1 题目分析4.2 代码 1. 前言 下面两个题目均来自牛客,使用的编程语言是c,分享个人的一些思路和代码。 2. JZ64 求123…n …

Vue 赋值后原数据随赋值后的数据的变化而变化

很常见的,当我们直接用“”号等方式直接赋值后 原数据会随赋值后的数据的变化而变化 但是有时候我们的需求是不需要原数据跟随变化 所以怎么解决呢? 解决办法有: 1.使用Object.assign() 方法 2.使用深拷贝函数 JSON.parse() 3.使用第三方库lo…

毕业生信息招聘平台|基于springboot+ Mysql+Java的毕业生信息招聘平台设计与实现(源码+数据库+文档+PPT)

目录 论文参考 摘 要 数据库设计 系统详细设计 文末获取源码联系 论文参考 摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 毕业生信息招聘平台,主要的模块包括查看管理员&a…

#ifndef 和 #pragma once的区别

#ifndef 和 #pragma once 都是用来防止头文件被重复包含的,但它们的工作方式和兼容性有所不同: #ifndef 是 C 的标准语法,它依赖于不重复的宏名称,保证了包含在 #endif 的内容不会被重复包含。这个内容可以是一个文件的所有内容&…

Webpack配置与运行基础教程

在前端开发中,Webpack是一款非常流行的模块打包工具,它可以帮助我们将多个文件打包成一个或多个静态资源文件,从而提高前端项目的性能和可维护性。本文将为你介绍Webpack的基础配置和运行方法,帮助你快速上手Webpack。 什么是Web…

基于Springboot的无人智慧超市管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的无人智慧超市管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

1.3 有哪些文本表示模型?它们各有什么优缺点?

1.3 有哪些文本表示模型?它们各有什么优缺点? 场景描述 文本是一类非常重要的非结构化数据,如何表示文本数据一直是机器学习领域的一个重要研究方向。 知识点 词袋模型(Bag of Words)TF-IDF(Term Frequency-Inverse DocumentFrequency)主题模型(Topic Model)词…

【每日刷题】数组-LC56、LC238、随想录1、LC560

1. LC56 合并区间 题目链接 Arrays.sort先让intervals里的子数组按照子数组的第一个数字值从小到大排列。开一个新数组,newInterval,存放合并好的子数组让intervals的当前子数组i的第一个数字与newInterval的当前子数组index的最后一个数字比较大小&am…

ARM 架构下国密算法库

目录 前言GmSSL编译环境准备下载 GmSSL 源码编译 GmSSL 源码SM4 对称加密算法SM2 非对称加密算法小结前言 在当前的国际形式下,国替势不可挡。操作系统上,银河麒麟、统信 UOS、鸿蒙 OS 等国产系统开始发力,而 CPU 市场,也是百花齐放,有 龙芯(LoongArch架构)、兆芯(X86…

Intel/国产化无人叉车机器视觉专用控制器

无人叉车和机器视觉是两个独立的技术领域,但它们可以结合使用以实现更高效的物流自动化。无人叉车是一种自动化运输工具,可以在没有人为干预的情况下完成货物的搬运和运输。机器视觉是一种人工智能技术,可以让计算机识别和理解图像或视频中的…

YOLO:实时目标检测的革命

目标检测作为计算机视觉领域的一个核心任务,一直以来都是研究的热点。而YOLO(You Only Look Once)技术作为其中的杰出代表,以其独特的处理方式和卓越的性能,成为了实时目标检测的标杆。本文将探讨YOLO技术的核心原理、…

FPGA时序约束与分析--建立时间与保持时间

文章目录 前言一、定义二、举例说明2.1 建立时间违规2.2 保持时间违规前言 时序约束的定义–设计者根据实际的系统功能,通过时序约束的方式提出时序要求; FPGA 编译工具根据设计者的时序要求,进行布局布线;编译完成后, FPGA 编译工具还需要针对布局布线的结果,套用特定的…

【C++】每日一题,189 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,…

搜索回溯算法(DFS)1------递归

目录 简介: 递归问题解题的思路模板 例题1:汉诺塔 例题2:合并两个有序链表 例题3:反转链表 例题4:两两交换链表中的节点 例题5:Pow(x,n)-快速幂 结语: 简介&…

嵌入式驱动学习第二周——断言机制

前言 这篇博客来聊一聊C/C的断言机制。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦! 目录 前言1. 断言介绍…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油…

串联所有单词的子串

题目链接 串联所有单词的子串 题目描述 注意点 words[i] 和 s 由小写英文字母组成1 < words.length < 5000可以以 任意顺序 返回答案words中所有字符串长度相同 解答思路 根据滑动窗口哈希表解决本题&#xff0c;哈希表存储words中所有的单词及单词的出现次数&#…

Reactor详解

目录 1、快速上手 介绍 2、响应式编程 2.1. 阻塞是对资源的浪费 2.2. 异步可以解决问题吗&#xff1f; 2.3.1. 可编排性与可读性 2.3.2. 就像装配流水线 2.3.3. 操作符&#xff08;Operators&#xff09; 2.3.4. subscribe() 之前什么都不会发生 2.3.5. 背压 2.3.6. …

p18 线性代数,行阶梯型矩阵

行阶梯型矩阵 行最简型矩阵

steam游戏搬砖,跨国信息差项目,每天1小时收益也很不错

大家好&#xff0c;我是阿阳&#xff01;每天都是一个新的开始&#xff01; 今天看到个Steam游戏搬砖项目&#xff0c;还是跨国国际贸易&#xff0c;感觉很好玩&#xff0c;特来给大家分享。 原理简介 就是把Steam上的游戏装备&#xff0c;搬运到国内网易Buff平台上来卖。目前…