Java中的枚举

Java中的枚举(Enumeration或Enum)是一种特殊的类,它用于表示一组常量。

在Java 5(即JDK 1.5)之前,实现类似枚举的功能通常需要使用一系列的静态常量(比如public static final),但这种方式并不够灵活和安全。

Java 5引入了枚举类型(enum),它提供了一种更简洁、类型安全的方式来定义一组命名的常量。

枚举的基本定义

枚举的定义类似于类,但是使用enum关键字来声明。枚举中可以直接定义常量(枚举项),也可以包含字段、方法、构造函数等。

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

在上面的例子中,Day是一个枚举类型,它包含了7个枚举项,分别代表一周的七天。

枚举的特性

  1. 自动封装:枚举类型的每个枚举项都是该类的一个实例,且这些实例默认是public static final的。

  2. 格式要求:枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。

  3. 类型安全:使用枚举类型可以使得代码更加清晰,同时避免了因错误使用字符串常量或整型常量而导致的错误。

  4. 方法定义:枚举类型可以定义自己的方法,包括构造方法(但构造方法默认是私有的,以防止外部实例化)。

  5. 不可被继承:枚举都是最终类,不可以被继承。

  6. switch语句支持:在Java中,switch语句可以直接对枚举类型进行操作,这使得基于枚举的分支逻辑更加简洁明了。

枚举中的字段和方法

枚举中可以定义字段和方法,但需要注意的是,枚举的构造方法默认是私有的,以防止外部代码直接实例化枚举

public enum Color {  RED("红色"), GREEN("绿色"), BLUE("蓝色");  private final String description;  // 私有构造方法  private Color(String description) {  this.description = description;  }  // 公开方法  public String getDescription() {  return description;  }  
}

枚举的高级用法

  • 实现接口:枚举类型可以实现一个或多个接口。
  • 枚举嵌套:一个枚举类型可以嵌套在另一个枚举类型中,或者嵌套在类中。
  • 枚举集合:Java提供了EnumSetEnumMap两个工具类来操作枚举类型的集合。

枚举与switch语句

由于枚举类型在编译时会被优化,使用枚举类型作为switch语句的表达式时,可以提高代码的可读性和安全性。

Day day = Day.MONDAY;  
switch (day) {  case MONDAY:  System.out.println("星期一");  break;  case FRIDAY:  System.out.println("星期五");  break;  // 其他情况...  default:  System.out.println("其他天");  
}

values() 和 valueOf(String name)

  • values():这是一个静态方法,返回包含枚举中所有常量的数组。这个方法在Enum类中定义,因此所有的枚举类型都可以使用它。
  • valueOf(String name):这也是一个静态方法,它根据枚举常量的名称返回枚举常量本身。如果传入的名称不匹配任何已知的枚举常量,则会抛出IllegalArgumentException

结论

Java中的枚举类型提供了一种强大的机制来定义一组固定的常量,并通过提供字段、方法以及实现接口等特性,使得枚举类型在Java编程中得到了广泛的应用。枚举类型不仅提高了代码的可读性和可维护性,还增强了代码的健壮性和类型安全性。

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

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

相关文章

JDK新特性(Lambda表达式,Stream流)

Lambda表达式: Lambda 表达式背后的思想是函数式编程(Functional Programming)思想。在传统的面向对象编程中,程序主要由对象和对象之间的交互(方法调用)构成;而在函数式编程中,重点…

postman给全部接口添加请求头数据(如token)

如果给没有一个接口添加请求头token就太慢了,如下图。可以点击所有接口的所属的目录。点击“Scripts”,点击Pre-request按钮。加入代码: pm.request.addHeader("Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI111pXVCJ9.eyJjbGFpbXMiOnsiaW…

Nginx负载均衡策略

upstream机制提供了负载均衡的功能,可以讲请求负载分担到集群服务器的某个服务器上 打包时候到时一个8085 一个8090 一个8095 nohup /usr/local/develop/jdk-17.0.10/bin/java -Xmx256m -Xms256m -jar nginx-demo-8085.jar > server8085.log 2>&1 & nohup /u…

56_Redis简单命令

一、引言 1.1 数据库压力过大 由于用户量增大,请求数量也随之增大,数据压力过大 一个请求的url 背后可能有有4-5个 sql的操作 每秒钟 qps(并发数) 1000 背后的sql操作 4000-5000mysql 单机并发量读写 8000-10000 &#x…

鸿蒙配置Version版本号,并获取其值

app.json5中配置版本号: 获取版本号: bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION).then((bundleInfo) > {let versionName bundleInfo.versionName; //应用版本号}).catch((error: BusinessE…

【Vulnhub系列】Vulnhub_DC-1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_DC-1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、在百度网盘中下载DC-1靶场。DC-1靶场受virtual box 的影响,在VM中直接打开是扫描不到IP 的…

jmeter录制

1、添加代理服务器 添加方法:“测试计划”右键 -> 添加 -> 非测试元件 -> HTTP代理服务器 2、添加线程组 添加方法:“测试计划”右键->添加->线程(用户)->线程组 3、配置http代理服务器 (1&a…

第三方软件测试报告可做哪些用途?

1. 评估软件质量:第三方软件测试报告通过对软件的各项性能指标进行测试和分析,能够客观地评估软件的质量水平。这份报告可以为软件的开发团队提供反馈,帮助他们发现和修复潜在的问题,提高软件的质量和稳定性。 2. 验证软件功能&a…

<数据集>手机识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:16172张 标注数量(xml文件个数):16172 标注数量(txt文件个数):16172 标注类别数:1 标注类别名称:[Phone] 使用标注工具:labelImg 标注规则:…

探索分布式光伏运维系统的组成 需要几步呢?

前言 随着光伏发电的不断发展,对于光伏发电监控系统的需求也日益迫切,“互联网”时代,“互联网”的理念已经转化为科技生产的动力,促进了产业的升级发展,本文结合“互联网”技术提出了一种针对分散光伏发电站运行数据…

c#调用python代码,实现读取npy的数据并显示图像

本例子实现的功能是: 根据stat.npy、ops.npy两个npy文件的内容,显示图形 1. 用python代码实现读取两个文件,文件名为read_npy.py,代码如下: import numpy as npdef read_npy_files(stat_file, ops_file):stat np.lo…

NSL-KDD入侵检测系统的设计与实现系列预告

每日进阶-基于机器学习的入侵检测系统——打怪升级之道 在当今的数字时代,网络安全不仅是防御,更是主动出击。你是否想知道如何用机器学习技术设计一套入侵检测系统(IDS),让黑客无所遁形?本系列文章将为您揭…

【全志H616开发】Linux守护进程

文章目录 守护进程简介基本特点创建一个守护进程通常涉及以下步骤:进程查看指令: 守护进程开发代码示例: 开机自动启动 守护进程 简介 Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性…

VScode | 我的常用插件分享

系列文章目录 本系列文章主要分享作位前端开发的工具之------VScode的使用分享。 文章目录 目录 系列文章目录 文章目录 前言 一、Vetur 三、别名路径跳转 四、Prettier 五、koroFileHeader 六、vue-helper 总结 前言 本文主要分享VScode的好用插件。 一、Vetur Vue的Vetur插…

【Vulnhub系列】Vulnhub_Raven2靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Raven2 渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 从网盘下载该靶机,在vm中选择【打开】 然后设置好存储路径,开机后检查靶机的网络连…

谷粒商城实战笔记-84-商品服务-API-新增商品-获取分类关联的品牌

文章目录 一,品牌查询接口的后台实现二,编码经验总结1,Controller层的作用1.1 参数处理1.2 调用Service1.3 处理Service返回结果实例 2,VO的封装时机3,Service中最好注入Service,不要直接依赖Dao 问题记录 …

vue2 vue3 props 的处理机制

在 Vue 2 中,props 是单向数据流,父组件向子组件传递的 props 默认情况下是不具有响应式特性的。这意味着当父组件的数据发生变化时,如果传递给子组件的 props 发生变化,子组件不会自动更新视图。 具体来说,在 Vue 2 …

增量学习中Task incremental、Domain incremental、Class incremental 三种学习模式的概念及代表性数据集?

1 概念 在持续学习领域,Task incremental、Domain incremental、Class incremental 是三种主要的学习模式,它们分别关注不同类型的任务序列和数据分布变化。 1.1 Task Incremental Learning (Task-incremental) 任务增量学习,也称为任务增…

【论文共读】【翻译】【GAN】Generative Adversarial Nets

论文原文地址:https://arxiv.org/pdf/1406.2661 翻译:Generative Adversarial Nets 生成对抗网络 0. 摘要 提出了一种新的对抗过程估计生成模型的框架,其中我们同时训练两个模型:一个是捕获数据分布的生成模型G,另一…