【Java高级语法】(十一)枚举类:还在因为使用了魔法数而被老大怼吗,一起来看看枚举器的作用吧!~

news2024/11/16 18:00:05

Java高级语法详解之枚举类

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 🔍 Enum类的常用方法
  • 4️⃣ 特征
  • 5️⃣ 应用场景
  • 🌾 总结

在这里插入图片描述

1️⃣ 概念

Java枚举类(Enumerator)是在Java 5中引入的新特性,以提供一种更好的方式来表示固定数量的常量。在之前的版本中,常常使用static final修饰的变量来表示常量,但这种方式存在着一些问题,如不够清晰,容易出现错误等。因此,Java引入了枚举类作为一种更可靠、清晰和类型安全的常量表示方式。

枚举是由有限个常量值组成的数据类型,这些常量值被称为枚举常量。在Java中,枚举类是一种特殊的类,它可以定义自己的方法、字段和构造函数,并且每个枚举常量都是一个独立的实例对象。

2️⃣ 优势和缺点

优点:

  • 清晰明确:枚举类提供了一种直观的方式来表示固定的常量集合,使代码更加清晰易懂;
  • 类型安全:枚举类的值在编译期间就已经确定,因此可以保证类型的安全性;
  • 可读性强:通过给枚举常量设置具有描述性的名称,可以使代码更加易读。

缺点:

  • 灵活性较低:枚举类的常量是固定的,无法动态的增加或减少。如果需要表示的常量集合可能在运行时发生改变,则枚举类不适用。

3️⃣ 使用

定义枚举类 的基本语法如下:

enum 枚举类名 {
    枚举常量1,
    枚举常量2,
    ...
}

创建枚举实例对象 的方式如下:

枚举类名 变量名 = 枚举类名.枚举常量;

枚举类还可以有自己的字段和方法,例如:

enum Weekday {
    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期天");

    private String chineseName;

    Weekday(String chineseName) {
        this.chineseName = chineseName;
    }

    public String getChineseName() {
        return chineseName;
    }
}

下面是一个实例程序,演示了如何定义和使用Java的枚举类:

// 定义一个表示季节的枚举类
enum Season {
    SPRING("Spring", "March to May"),
    SUMMER("Summer", "June to August"),
    AUTUMN("Autumn", "September to November"),
    WINTER("Winter", "December to February");
    
    private String name; // 季节名称
    private String duration; // 季节持续时间
    
    // 枚举类的构造方法
    Season(String name, String duration) {
        this.name = name;
        this.duration = duration;
    }
    
    public String getName() {
        return name;
    }
    
    public String getDuration() {
        return duration;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", duration='" + duration + '\'' +
                '}';
    }
}

代码说明:

  • enum Season { ... }:定义了一个枚举类Season,其中包含了四个枚举常量SPRINGSUMMERAUTUMNWINTER
  • private String name;private String duration;:类的私有成员变量,用于存储季节的名称和持续时间;
  • Season(String name, String duration):枚举类的构造方法,用于设置每个枚举常量的名称和持续时间;
  • public String getName()public String getDuration():通过这两个公共方法获取枚举常量的名称和持续时间。
public class EnumExample {
    public static void main(String[] args) {
        // 使用枚举常量
        System.out.println(Season.SPRING.getName());
        System.out.println(Season.SPRING.getDuration());
        
        // 遍历枚举常量
        System.out.println("\n遍历全部枚举:");
        for (Season season : Season.values()) {
            System.out.println(season);
        }
        
        // 使用枚举类的valueOf()方法获取枚举常量
        Season autumn = Season.valueOf("AUTUMN");
        System.out.println("\n使用valueOf()方法获取枚举:" + autumn); // 输出:Autumn
        
        // 使用switch语句根据枚举类值进行操作
        Season currentSeason = Season.SUMMER;
        switch (currentSeason) {
            case SPRING:
                System.out.println("\nIt's springtime!");
                break;
            case SUMMER:
                System.out.println("\nEnjoy your summer vacation!");
                break;
            case AUTUMN:
                System.out.println("\nWelcome to the autumn season.");
                break;
            case WINTER:
                System.out.println("\nBundle up, it's winter!");
                break;
        }
    }
}

代码说明:

  • System.out.println(Season.SPRING.getName());:使用枚举常量的名称来获取对应的字段值,并打印出来;
  • for (Season season : Season.values()) { ... }:遍历枚举常量,打印每个季节及其持续时间;
  • Season autumn = Season.valueOf("AUTUMN");:使用 valueOf() 方法获取枚举常量AUTUMN的实例;
  • switch (currentSeason) { ... }:使用 switch 语句根据当前季节进行不同的操作。

以上这个案例程序展示了枚举类的定义和使用方式,通过季节枚举类的例子,让我们可以对枚举类的概念和用法有更深入的理解。

运行结果:

Spring
March to May

遍历全部枚举:
Season{name='Spring', duration='March to May'}
Season{name='Summer', duration='June to August'}
Season{name='Autumn', duration='September to November'}
Season{name='Winter', duration='December to February'}

使用valueOf()方法获取枚举:Season{name='Autumn', duration='September to November'}

Enjoy your summer vacation!

🔍 Enum类的常用方法

以下是一些常用的Enum类的方法:

  • values(): 返回包含所有枚举值的数组;
  • valueOf(String name): 根据给定的名称返回对应的枚举常量;
  • name(): 返回枚举常量的名称;
  • ordinal(): 返回枚举常量在声明时的顺序(从0开始);
  • compareTo(EnumType e): 比较两个枚举常量在声明时的顺序,如果相同返回0,否则返回正数或负数。

这些方法可以帮助我们对枚举类型进行遍历、比较和转换等操作。此外,我们还可以为枚举类定义自己的实例字段、构造函数和方法,以满足具体需求。

上面案例已经演示了这些方法的使用方式及作用,此处不再额外演示。

4️⃣ 特征

Java的枚举类(Enum)是一种特殊的数据类型,它具有以下特征:

  1. 有限选项:枚举类定义了一个固定的、有限的选项列表。这些选项在编译时就被确定,并且不能随意更改;

  2. 单例模式:每个枚举常量在运行时只会被实例化一次,因此枚举类天然支持单例模式的实现;

  3. 安全类型:枚举类提供了类型安全性,因为它只能包含预定义的常量值,不允许任意其他的值;

  4. 可迭代:枚举类可以被遍历,可以通过values()方法获取所有枚举常量的数组,并进行迭代;

  5. 可比较:枚举类默认实现了Comparable接口,可以使用compareTo()方法进行枚举常量之间的比较;

  6. 扩展性:枚举类可以定义构造函数、成员变量和方法,也可以实现接口,从而给枚举常量添加自定义的行为;

  7. switch语句简化:在使用枚举类时,可以使用switch语句处理枚举常量,使代码结构更加清晰易懂;

  8. 序列化支持:枚举类默认实现了Serializable接口,可以通过序列化和反序列化进行存储和传输;

  9. 不可继承:枚举类默认继承 java.lang.Enum 类,而不是 Object 类,因此枚举类不能显式继承其他父类。同时,使用 enum 定义的非抽象的枚举类默认会使用 final 修饰,因此非抽象枚举类也不能派生子类(即不能被继承);

  10. 构造器权限私有:枚举类的构造器只能使用 private 访问控制符,如果忽略访问控制符的话,则默认使用 private 修饰;如果强制指定其他的访问控制符(例如public、procted等),则会报错;

  11. 代码顺序影响: 枚举类的所有实例必须在枚举类中的最前面显式列出,否则这个枚举类永远都不可能产生实例。列出的实例默认使用 public static final 修饰。枚举类的实例以逗号分隔,分号结束,这些列出的枚举值代表了该枚举类的所有可能的实例。

5️⃣ 应用场景

枚举类在很多场景中都能发挥重要作用,特别适合以下情况:

  • 定义一组相关的常量:例如表示星期几、方向、状态等;
  • 限制参数的取值范围:对于某些方法来说,其参数只能在一个预定义的范围内取值,此时可以使用枚举类;
  • 替代常数集合:在过去,常常通过使用static final变量集合来表示一组常量值,现在可以使用枚举类来替代。

🌾 总结

以上是关于Java枚举类的一些知识介绍,主要包括其概念、优势和缺点、使用方式和案例、 Enum类的常用方法、枚举类的特征及其应用场景等方面。

通过使用枚举类,可以使代码更具有可读性、可维护性,并且降低错误发生的概率。在实际开发中,根据需求的不同,可以灵活运用枚举类来达到更好的编码效果。

在这里插入图片描述

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

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

相关文章

TestOne自动化测试日志自动分类算法,帮助用户快速处理执行错误!

自动化测试的每次执行,都会产生大量的日志信息。特别是当执行发生错误,比如数据库异常、通讯异常等情况的时候,大量执行的自动化测试用例会报错。 实际上,很多错误的类型是比较类似的,但由于测试用例的数量很大&#x…

Goby 漏洞发布|泛微E-office协同办公系统 download.php 文件 filename 参数文件读取漏洞

漏洞名称:泛微E-office协同办公系统 download.php 文件 filename 参数文件读取漏洞 English Name:maxView Storage Manager dynamiccontent.properties.xhtml RCE CVSS core: 5.0 影响资产数:4971 漏洞描述: 泛微E-office协同…

餐饮点餐外卖小程序软件开发

餐饮点餐外卖小程序是一种基于微信平台的,提供在线点餐、外卖配送等服务的应用程序。以下是可能有助于餐饮点餐外卖小程序软件开发的功能: 商品展示:提供菜品分类、搜索、详情等功能,让用户可以方便快捷地查看商品信息。 …

研发效能平台的“双流”模型

本文摘于《软件研发效能权威指南》——第 9 章 核心观点 开发人员在多个“单点式”工具平台之间的来回切换是很耗费时间和精力的。“一站式”是指把研发各个环节的软件工程能力集成在一个统一的平台上,对新人友好,对老人提效。“一键式”是指让研发工程…

【流光溢彩】物联网入门 - ESP8266 + WS2812B 制作流光溢彩灯带

一、硬件准备 ESP8266 模块 x1WS2812B 灯带(60/米,根据显示器四周长度买即可) x1杜邦线 若干DC 电源 x1 二、软件准备 1. ESP8266 串口驱动 一般购买详情页都会有写,没有就找商家要一个。 一般是 CH340 或者 CP2102&#xff0c…

在 C4D 和 Redshift 中设置程序变形鸡尾酒动画

今天瑞云渲染小编给大家带来动画设计师 Victor V. 分享的 Pick Your Weapon 项目背后的工作流程,展示了 Cinema 4D 工作流程,并解释了动画是如何在 Redshift 中渲染的。 介绍 我是 Victor,我是居住在意大利的智利动画设计师,一年…

Xcode 14.3.1 (14E300c) 下载 - Apple 平台 IDE

Xcode 14.3.1 (14E300c) 下载 - Apple 平台 IDE Command Line Tools for Xcode 14, tvOS 16 & watchOS 9 Simulator Runtime 请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。 作者主页…

基于Confluent Kafka部署Kafka Connect集群,Kafka Connect集群加载debezium插件

基于Confluent Kafka部署Kafka Connect集群,Kafka Connect集群加载debezium插件 一、下载Confluent Kafka二、配置文件connect-distributed.properties三、启动脚本connect-distributed四、启动Kafka Connect集群五、加载debezium插件六、总结和延伸 一、下载Conflu…

leetcode39. 组合总和(回溯算法-java)

组合总和 leetcode39. 组合总和题目描述解题思路代码演示 回溯算法专题 leetcode39. 组合总和 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/combination-sum 题目描述 给你一个 无重复元素 的整数数组 candidates 和一…

浏览器跨域限制:为什么浏览器不能跨域发送Ajax请求?

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言什么是跨域请求&am…

什么是虚拟展厅?教您快速打造一个3D元宇宙虚拟展厅

引言: 在如今的数字化时代,虚拟展厅和3D元宇宙成为了展示和推广产品、品牌以及创意的新兴方式。虚拟展厅为企业带来了无限的可能性,如何快速打造一个3D元宇宙虚拟展厅成了许多企业想了解的。 一.虚拟展厅的魅力 1.什么是虚拟展厅…

BUUCTF刷题十一道(07)

文章目录 [Zer0pts2020]Can you guess it?[CISCN2019 华北赛区 Day1 Web2]ikun[GWCTF 2019]枯燥的抽奖[WUSTCTF2020]CV Maker[NCTF2019]True XML cookbook[RCTF2015]EasySQL[CISCN2019 华北赛区 Day1 Web1]Dropbox[CISCN2019 华北赛区 Day1 Web5]CyberPunk[红明谷CTF 2021]wri…

防汛四级应急响应启动,尾矿库如何安全度过汛期?

国家防总办公室向上海、江苏、浙江、安徽、江西、河南、湖北、湖南、广西、重庆、四川、贵州、云南等省份防指下发通知,要求全面压实以地方行政首长负责制为核心的各项防汛责任,加强精准监测预报和会商研判,落实好“叫应”机制,确…

我把一句话需求交给AI,它竟然给我返回了……

👉腾小云导读 也许你经历过这种情况:产品和设计同学用一句话就把需求说完了,你抓破脑袋做出来的版本又达不到他们的要求。不如尝试让 AI 承担痛苦,让它理解、拆解并实现一句话需求?本篇作者尝试提出一个自动配置可视化…

踩坑:Vue3 中的watch监视属性

文章目录 一、问题一:reactive 定义的响应式数据无 oldValue问题分析解决 二、问题二:watch默认开启了深度监视且无法关闭问题分析解决 一、问题一:reactive 定义的响应式数据无 oldValue 问题 监视 reactive 所定义的一个响应式数据&#…

linux安装git步骤;基于yum、dnf、源码安装【非常详细】

这里写目录标题 一 dnf安装二 yum安装三 源码安装1 基于 RPM 的发行版(Fedora/RHEL/RHEL衍生版)2 基于 Debian 的发行版(Debian/Ubuntu/Ubuntu-derivatives)3 yum软件包管理器来安装,这个一般是CnetOS Stream 8以前的版…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 与其他的商业数据库在HTAP的异同点(译)...

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

​关于 O2OA (翱途) 软件商用许可证授权形式的调整​

尊敬的小伙伴们: 非常感谢您对 O2OA 开发平台的关注与支持! 兰德网络 O2OA 平台软件商用许证授权形式正式由 “按年授权” 改为 “按版本买断” 的永久许可形式。 这意味着,合作伙伴在持有特定版本的软件商用许可后,将能够永久…

《Python精选300题》

专栏简介 Python 是一门功能强大的编程语言,已经成为了数据科学、机器学习、Web 开发等领域的首选语言之一。因此,掌握 Python 的相关知识点对于学习和使用这门语言至关重要。 本专栏中,精选了 300 道题目,囊括了 Python 入门阶段…

什么是链表?

链表 什么是链表? 链表是有序的数据结构,链表中的每个部分称为节点。可以首、尾、中间进行数据存取,链表的元素在内存中不必是连续的空间,每个节点通过 next 指针指向下一个节点。 优点 链表的添加和删除不会导致其余元素位移。…