Java枚举详解

一、什么是枚举类型

        枚举类型是一种特殊的数据类型,用于定义一组固定的命名常量。枚举类型提供了一种更强大、更安全和更易读的方式来表示一组相关的常量。

        在Java中,枚举类型是通过使用enum关键字来定义的。枚举类型可以包含一个或多个枚举常量,每个常量都是枚举类型的实例。枚举常量是在枚举类型中预先定义的,它们是唯一的、已命名的对象。

        在Java中,枚举类型是一组固定常量值的集合,每个常量值代表一个特定的数据类型。枚举在Java中被视为数据类型,你可以使用它们来创建枚举类型的变量、数组、参数等。

二、枚举的引入

要求创建一个季节(Season)类,只能创建春夏秋冬4个对象。

  • 旧方法:假如按照以往的思路,只能创建一个普通的Season 类。
  • 代码如下:

public class Enumeration01 {public static void main(String[] args) {//使用Season spring = new Season("春天", "温暖");Season winter = new Season("冬天", "寒冷");Season summer = new Season("夏天", "炎热");Season autumn = new Season("秋天", "凉爽");Season other = new Season("红天", "~~~");// 可以随意多创建对象,不满足题目要求
//     autumn.setName("XXX");// 会改变对象的属性,不满足题目的要求
//     autumn.setDesc("非常的热..");}
}
class Season{//类private String name;private String desc;// 季节描述public Season(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}

        思考:使用普通类的定义,我们不能体现Season 类只有4个固定的对象,因为使用者可以随意创建更多的对象。因此我们需要一种特殊的类,可以限制使用者创建的对象的个数与类型 ---- 于是便引入了枚举类。
        枚举(enumeration):枚举是一组常量的集合;它是一种特殊的类,里面只包含一组有限的特殊的不能修改的对象。

三、枚举的基本用法

  • 使用 enum 关键字实现枚举:

使用步骤:
(1)使用 enum 关键字取代 class 关键字定义一个类,该类便称为枚举类。
(2)在枚举类内部直接创建对象,枚举类对象是默认使用 public static final 一起修饰的,如果有多个对象,则必须且只能使用(,)间隔开。
(3)在枚举类中将构造器私有化,防止外部随意创建枚举类对象。
(4)只保留属性的get 方法,不提供属性的 set 方法,防止枚举类的对象属性被更改。

  • 将上例代码修改如下:

public class Enumeration03 {public static void main(String[] args) {System.out.println(Season.AUTUMN);System.out.println(Season.SUMMER);}
}enum  Season {//类//定义了四个静态对象,使用了enum 来实现枚举类/*1. 使用关键字 enum 替代 class;2. public static final Season SPRING = new Season("春天", "温暖") 直接使用SPRING("春天", "温暖") 来代替,即常量名(实参列表);3. 如果有多个常量(对象), 使用 , 号间隔即可;4. 如果使用enum 来实现枚举,要求将定义常量对象的语句,写在第一行;5. 如果我们使用的是无参构造器,创建常量对象,则可以省略括号();*/SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "凉爽"),SUMMER("夏天", "炎热");// 调用了构造器// 下面定义对象的语句和上面的效果是一样的。
//    public static final Season SPRING = new Season("春天", "温暖");
//    public static final Season WINTER = new Season("冬天", "寒冷");
//    public static final Season AUTUMN = new Season("秋天", "凉爽");
//    public static final Season SUMMER = new Season("夏天", "炎热");private String name;private String desc;private Season() {//无参构造器}private Season(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public String getDesc() {return desc;}// 打印对象的信息@Overridepublic String toString() {return "Season{" +"name='" + name + '\'' +", desc='" + desc + '\'' +'}';}
}
  • 说明:使用 enum 关键字后,Season 类中的对象变成了固定的对象,这样便能满足我们一开始提出的要求了。
  • 对比图如下:

四、枚举的注意事项和细节 

(1)当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类,而且是一个 final 类,不能再被其他类继承。
(2)传统的 public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”), 这里必 须知道,它调用的是哪个构造器。
(3)如果使用无参构造器 创建 枚举对象时,其实参列表和小括号都可以省略。
(4)当有多个枚举对象时,使用(,)间隔,最后由一个分号结尾。
(5)定义类枚举对象的语句必须放在枚举类的第一句。

(6)使用 enum 关键字后,就不能再继承其它类了,因为 enum 类会隐式继承 Enum,而 Java 是单继承机制。

五、枚举类的常用方法

以下是枚举类型常用的方法以及它们的用途:

  • 代码演示:
public class EnumMethod {public static void main(String[] args) {//使用Season 枚举类,来演示各种方法Season autumn = Season.AUTUMN;//输出枚举对象的名字  AUTUMNSystem.out.println(autumn.name());//ordinal() 输出的是该枚举对象的次序/位置号,从0开始编号//AUTUMN 枚举对象是第三个,因此输出 2System.out.println(autumn.ordinal());// values方法,返回 Season2[]// 含有定义的所有枚举对象Season[] values = Season.values();System.out.println("===遍历取出枚举对象(增强for)====");for (Season season: values) {System.out.println(season);}//valueOf:将字符串转换成枚举对象,要求字符串必为已有的对象名,否则报异常//执行流程//1. 根据你输入的 "AUTUMN" 到 Season2的枚举对象去查找//2. 如果找到了,就返回,如果没有找到,就报错Season autumn1 = Season.valueOf("AUTUMN");System.out.println("autumn1=" + autumn1);System.out.println(autumn == autumn1);//compareTo:比较两个枚举常量,比较的就是位置号// 就是把 Season.AUTUMN 枚举对象的位置号 和 Season.SUMMER枚举对象的位置号比较/*源码如下:public final int compareTo(E o) {return self.ordinal - other.ordinal;}*/// Season.AUTUMN的编号[2] - Season.SUMMER的编号[3]System.out.println(Season.AUTUMN.compareTo(Season.SUMMER));// 最后补充了一个增强forint[] nums = {1, 2, 9};//普通的for循环System.out.println("=====普通的for=====");for (int i = 0; i < nums.length; i++) {System.out.println(nums[i]);}System.out.println("=====增强的for=====");//执行流程是 依次从nums数组中取出数据,赋给i, 如果取出完毕,则退出forfor(int i : nums) {System.out.println("i=" + i);}}
}

六、枚举的优缺点

优点:

1.易读性和可维护性:枚举类型中的常量是有意义的、自描述的,使得代码更易读、易理解和易于维护。枚举常量具有唯一的名称,提供了更好的文档和注释。

2.类型安全:枚举类型在编译时进行静态类型检查,这意味着编译器可以确保只使用有效的枚举常量,提供了更高的类型安全性。

3.可限定的值集合:枚举类型定义了一个有限的值集合,限定了有效的取值范围。这可以帮助避免程序中出现无效或意外的取值。

4.避免魔法数值:使用枚举类型可以避免使用硬编码的魔法数值,提供了更好的代码可读性和可维护性。

5.增强的编译器支持:枚举类型在编译器层面提供了一些额外的支持,如自动添加常用方法(如values()、valueOf())、枚举常量的顺序等。

6.适用于状态和选项的表示:枚举类型非常适用于表示状态、选项和固定集合,如季节、颜色、星期几等。
 

缺点:

1.不适用于动态变化的数据:枚举类型是在编译时定义的,其常量集合是固定的。如果需要表示动态变化的数据集合,枚举类型可能不适合。

2.不适用于大型数据集合:如果需要表示大型的数据集合,枚举类型的常量定义可能会变得冗长和繁琐。

3.缺乏扩展性:枚举类型的常量是在编译时确定的,不支持动态添加或删除常量。因此,如果需要频繁地修改常量集合,可能会导致代码的改动和维护成本的增加。

4.不支持继承:枚举类型不支持继承,无法实现枚举类型之间的继承关系。
 

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

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

相关文章

vue005——vue组件入门(非单文件组件和单文件组件)

一、非单文件组件 1.1、单文件组件的使用 1.1.1、局部注册 1、第一步&#xff1a;创建school组件 2、第二步&#xff1a;注册组件&#xff08;局部注册&#xff09; 3、第三步&#xff1a;使用组件&#xff08;编写组件标签&#xff09; <!DOCTYPE html> <html>…

设计模式—里氏替换原则

1.概念 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说&#xff0c;任何基类可以出现的地方&#xff0c;子类一定可以出现。 LSP是继承复用的基石&#xff0c;只有当衍生类可以替换掉基类&#xff0c;软件单位的功能不受到影…

Mac Ubuntu双系统解决WiFi和WiFi 5G网络不可用问题

文章目录 设备信息1. Ubuntu WiFi不可用解决方式查看Mac的网卡型号根据网卡型号搜索获取到的解决方法查看WiFi名字问题参考链接 2. 解决WiFi重启后失效问题打开终端创建.sh脚本文件编辑脚本文件复制粘贴脚本修改脚本权限创建并编辑systemd service文件复制粘贴下文到systemd se…

只考数据结构,计算机评级C+,成都信息工程大学考情分析

成都信息工程大学(C) 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、24专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1715字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 …

Java实现求最大值

1 问题 接收用户输入的3个整数&#xff0c;如何将最大值作为结果输出。 2 方法 采用“截图文字代码”的方式描述。 引入输入包调用main()函数&#xff0c;提示并接收用户输入的3个整数&#xff0c;并交由变量a b c来保存。对接收的3个数据进行比较&#xff0c;先比较a和b&#…

原型 原型对象 原型链

在面向开发对象开发过程中对每一个实例添加方法&#xff0c;会使每一个对象都存在该添加方法造成空间浪费 通过对原型添加公共的属性或方法&#xff0c;使所有实例对象都可访问 原型为了共享公共的成员 prototype 原型: JS为每个构造函数提供一个属性prototype(原型),它的值…

深眸科技聚焦AI机器视觉检测,驱动3C电子行业集成创新实现新需求

随着消费的升级及国家政策的助推&#xff0c;国内3C电子市场不断扩大&#xff0c;行业实现高速发展。近年来&#xff0c;3C电子产品持续迭代&#xff0c;生产工艺也逐渐复杂化&#xff0c;相关生产线定位组装、零部件检测、整机产品检测等环节&#xff0c;亟需使用具备较强适应…

举个栗子!Quick BI 技巧(4):创建面积图

面积图又叫区域图&#xff0c;是在折线图的基础之上形成的, 它将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充&#xff0c;这样一个填充区域我们叫做面积&#xff0c;颜色的填充也可以更好的突出趋势信息。 有数据粉好奇如何使用 Quick BI 来制作面积图&#xf…

NVMe-oF E-JBOF设计解析:WD RapidFlex网卡、OpenFlex Data24

OpenFlex Data24 NVMe-oF Storage Platform WD的SN840 NVMeSSD新品并没有太吸引我注意&#xff0c;因为它还是PCIe 3.0接口的&#xff0c;要知道Intel的PCIe 4.0 SSD都已经推出了。 但上面这个NVMe-oF&#xff08;NVMe over Fabric&#xff09;EBOF&#xff08;区别于普通JBO…

css三角,鼠标样式,溢出文字

目录 css三角 鼠标样式 例子&#xff1a;页码模块 溢出文字表示方式 margin负值运用 css三角强化 css三角 css三角中&#xff1a;line-height&#xff1a;0和font-size&#xff1a;0是防止兼容性的问题 jd {position: relative;width: 120px;height: 249px;background-…

在 Ubuntu 上安装最新版的 Calibre

目录 前言 方法1&#xff1a;从 Ubuntu 的仓库安装 Calibre 卸载 Calibre 方法2&#xff1a;获取最新版本的 Calibre 卸载 Calibre 结语 前言 Calibre 是一款自由开源的电子书软件。下面介绍如何在 Ubuntu Linux 上安装它。 作为电子书管理的瑞士军刀&#xff0c;Calibre …

线程-Thread类及常见方法

目录 一、创建线程 1.继承 Thread 类 2. 实现 Runnable 接口 3.匿名内部类创建 Thread 子类对象 4. 匿名内部类创建 Runnable 子类对象 5. lambda 表达式创建 Runnable 子类对象 二、Thread 类及常见方法 2.1 Thread 的常见构造方法 2.2 Thread 的几个常见属性 2.3 启…

C++初级项目webserver项目流程介绍(2)

一、引言 C的webserver项目是自己在学完网络编程后根据网课的内容做的一个初级的网络编程项目。 这个项目的效果是可以在浏览器通过输入网络IP地址和端口&#xff0c;然后打开对应的文件目录 效果如下&#xff1a; 也可以打开文件夹后点击目录&#xff0c;打开到对应的文件夹…

ES之x-pack-core-7.14.2许可证修改为白金版

X-Pack是什么 X-pack是elasticsearch的一个扩展包&#xff0c;将安全&#xff0c;警告&#xff0c;监视&#xff0c;图形和报告功能捆绑在一个易于安装的软件包中&#xff0c;虽然x-pack被设计为一个无缝的工作&#xff0c;但是你可以轻松的启用或者关闭一些功能。 主要分一下步…

WebSocket 鉴权策略与技巧详解

WebSocket 作为实时通信的利器&#xff0c;越来越受到开发者的青睐。然而&#xff0c;为了确保通信的安全性和合法性&#xff0c;鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制&#xff0c;为你呈现一揽子的解决方案&#xff0c;确保你的 WebSocket 通信得心应…

【Qt之QTextDocument】使用及表格显示富文本解决方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格显示富文本结论 描述 QTextDocument类保存格式化的文本。 QTextDocument是结构化富文本文档的容器&#xff0c;支持样式文本和各种文档元素&#xff0c;如列表、表格、框架和图像。…

手把手教你安装 Visual Studio 2022 及其简单使用

软件下载 打开 Visual Studio 官网&#xff0c;个人选择免费的Community社区版就够用了。 软件安装 双击运行安装程序&#xff1a; 点击继续 即可&#xff1a; 等待加载完成&#xff1a; 可以看到 Visual Studio 2022 对应不同的开发需求提供了若干工作负载&#xff0c;这里以…

​3ds Max插件CG MAGIC图形板块为您提升线条效率!

​通过3ds Max软件进行绘图操作时&#xff0c;大多绊住各位设计师们作图速度的往往都是一些细微的琐事&#xff0c;重复一变一变的调整修改等问题。 今天说到这个绘图线条来回调整解决方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作为一款智能化的辅助插件&#xff0c;致力于…

flutter编译和构建鸿蒙应用程序(windows环境)

flutter编译和构建鸿蒙应用程序&#xff08;windows环境&#xff09; 问题背景 针对 OpenHarmony 的 Flutter 版本已经开源&#xff0c;参考 https://gitee.com/openharmony-sig/flutter_flutter。 本文为实践该流程&#xff0c;实现flutter打包鸿蒙hap包的流程。目前流程已经…

Ps:画笔工具的基本操作

画笔工具 Brush Tool是 Ps 中最常用的工具&#xff0c;广泛地用于绘画与修饰工作。 虽然多数操作可在画笔工具的工具选项栏中选择执行&#xff0c;但是如果能记住相应的快捷键可大大提高工作效率。 熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Ps 中许多…