枚举的定义及其使用

devtools/2025/3/22 15:38:31/

在Java中,enum(枚举)是一个特殊的类,用于表示一组常量。enum类型在Java中提供了一种类型安全的方式来定义常量,相比传统的常量(如public static final变量),它更加简洁、类型安全,并且可以包含字段、方法和构造函数。枚举类型继承自java.lang.Enum类,因此它们具有一些内置的方法,例如values()valueOf()

1. 枚举的基本定义

枚举用于定义一组常量。你可以通过enum关键字来定义一个枚举类型。每个枚举常量可以作为该枚举类型的一个实例。

java">public enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

在这个例子中,Day枚举包含了一周的七天常量。每个常量都隐式是Day类型的一个实例。

2. 枚举的基本使用

枚举常量可以直接使用,枚举类型还提供了values()方法,它返回一个包含所有枚举常量的数组。

java">public class EnumExample {public static void main(String[] args) {Day day = Day.MONDAY;// 使用枚举常量switch (day) {case MONDAY:System.out.println("Start of the work week!");break;case SUNDAY:System.out.println("It's the weekend!");break;default:System.out.println("Mid-week");break;}// 输出所有枚举常量for (Day d : Day.values()) {System.out.println(d);}// 使用 valueOf 方法Day dayFromString = Day.valueOf("MONDAY");System.out.println("Day from String: " + dayFromString);}
}

输出:

Start of the work week!
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
Day from String: MONDAY

3. 枚举可以有字段和方法

枚举不仅仅包含常量,还可以包含字段和方法。比如,你可以为每个枚举常量添加一些与之相关的数据,或者定义一些方法来处理这些数据。

java">public enum Direction {NORTH(0), EAST(90), SOUTH(180), WEST(270);private final int degree;// 构造函数Direction(int degree) {this.degree = degree;}public int getDegree() {return degree;}
}public class EnumWithMethods {public static void main(String[] args) {// 输出方向和它们的角度for (Direction direction : Direction.values()) {System.out.println(direction + " has degree: " + direction.getDegree());}}
}

输出:

NORTH has degree: 0
EAST has degree: 90
SOUTH has degree: 180
WEST has degree: 270

4. 枚举的常用方法

values() 方法

values()方法返回包含所有枚举常量的数组。你可以用它来遍历所有的枚举常量。

java">for (Day day : Day.values()) {System.out.println(day);
}
valueOf(String name) 方法

valueOf()方法将字符串转换为对应的枚举常量。如果传入的字符串与枚举常量名称不匹配,会抛出IllegalArgumentException

java">Day day = Day.valueOf("MONDAY");
System.out.println(day);  // 输出 MONDAY
ordinal() 方法

ordinal()方法返回枚举常量的序号(从0开始)。它表示枚举常量在声明时的顺序。

java">System.out.println(Day.MONDAY.ordinal());  // 输出 1

5. 枚举的构造函数

枚举常量可以有构造函数,你可以在构造函数中初始化枚举常量的字段。每个枚举常量都调用该构造函数进行初始化。

java">public enum Planet {MERCURY(3.303e+23, 2.4397e6), // 第一个常量VENUS(4.867e+24, 6.0518e6),   // 第二个常量EARTH(5.976e+24, 6.3781e6);   // 第三个常量private final double mass;   // 质量private final double radius; // 半径// 构造函数Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}public double getMass() {return mass;}public double getRadius() {return radius;}public double surfaceGravity() {final double G = 6.67300E-11; // 引力常数return G * mass / (radius * radius);}public static void main(String[] args) {for (Planet p : Planet.values()) {System.out.printf("%s: mass = %.2e, radius = %.2e, gravity = %.2f%n",p, p.getMass(), p.getRadius(), p.surfaceGravity());}}
}

输出:

MERCURY: mass = 3.30e+23, radius = 2.44e+06, gravity = 3.70
VENUS: mass = 4.87e+24, radius = 6.05e+06, gravity = 8.87
EARTH: mass = 5.98e+24, radius = 6.38e+06, gravity = 9.81

6. 枚举与switch语句

你可以使用switch语句来基于枚举常量执行不同的代码块。由于枚举类型是类型安全的,switch语句可以确保只有枚举类型的常量才能用于比较。

java">public class EnumSwitchExample {public static void main(String[] args) {Day day = Day.WEDNESDAY;// 使用switch语句判断当天是周几switch (day) {case MONDAY:System.out.println("Start of the week!");break;case WEDNESDAY:System.out.println("Midweek!");break;case FRIDAY:System.out.println("Almost weekend!");break;default:System.out.println("Weekday!");}}
}

输出:

Midweek!

总结

  • 定义枚举类型:使用enum关键字可以定义枚举类型,表示固定的一组常量。
  • 字段和方法:枚举类型可以有字段和方法,用来处理与枚举常量相关的逻辑。
  • 内置方法values()方法返回所有枚举常量,valueOf()方法根据名称返回对应常量,ordinal()返回常量的序号。
  • 类型安全:枚举提供了一种类型安全的方式来处理常量,避免了传统常量方式可能导致的错误。

通过枚举,你可以在Java中轻松地表示一组常量,并且可以附加更多的逻辑,极大地增强了代码的可读性和可维护性。


http://www.ppmy.cn/devtools/169180.html

相关文章

Vue3 基础语法指南:响应式系统与 Ref 应用

1、Reactive 的深度响应式 1.1、基本用法 vue <script setup> import { reactive } from vueconst state reactive({count: 0,user: {name: Alice,age: 30} })const increment () > state.count const updateName () > state.user.name Bob </script>1…

StarRocks 升级注意事项

前段时间升级了生产环境的 StarRocks&#xff0c;从 3.3.3 升级到了 3.3.9&#xff0c;期间还是踩了不少坑所以在这里记录下。 因为我们的集群使用的是存算分离的版本&#xff0c;也是使用官方提供的 operator 部署在 kubernetes 里的&#xff0c;所以没法按照官方的流程进入虚…

人工智能之数学基础:高斯消元法求解线性方程组

本文重点 前面我们已经学习过了矩阵,以及矩阵的一系列含义,相信此时此刻在你的眼中矩阵已经不是一个简单的东西了,它是线性代数中的函数。将线性方程组中的系数组成一个矩阵,就可以通过这个矩阵来求解方程组的解了,本文介绍高斯消元法求解线性方程组。 线性方程组的矩阵…

ES、Kibana一键式部署脚本执行文件,外加IK分词器和拼音分词器

#!/bin/bash# 设置变量 ES_VERSION"7.12.1" KIBANA_VERSION"7.12.1" ES_CONTAINER"es" KIBANA_CONTAINER"kibana" NETWORK_NAME"es-net" ES_DATA_VOLUME"es-data" ES_PLUGINS_VOLUME"es-plugins" ES_PO…

HTML5拖拽功能教程

HTML5拖拽功能教程 简介 HTML5引入了原生拖放(Drag and Drop)API&#xff0c;使开发者能够轻松实现网页中的拖拽功能&#xff0c;无需依赖第三方库。拖拽功能可以大大提升用户体验&#xff0c;适用于文件上传、列表排序、看板系统等多种交互场景。本教程将带您全面了解HTML拖…

数据类设计_图片类设计之7_矩阵图形类设计更新_实战之页面简单设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 前面讲过的混合类型设计,实际上是矩阵类图形设计(名称已更新).他能够产生的视觉效果是这样的: 注意:外层的矩形边框可以不存在,只是说明了图形存在于一个矩形区…

Java 第十一章 GUI编程(3)

目录 内部类 内部类定义 内部类的特点 匿名内部类 格式&#xff1a; 内部类的意义 实例 内部类 ● 把类定义在另一个类的内部&#xff0c;该类就被称为内部类。 ● 如果在类 Outer 的内部再定义一个类 Inner&#xff0c;此时类 Inner 就称为内部类 &#xff08;或称为嵌…

简化神经元模型7 -- GIF Model

Hindmarsh-Rose 模型 目录 0. 写在前面 1. GIF 模型的定义 2. GIF 模型的动力学分析 2.1. 角度一&#xff1a;GIF 模型的变量较多 2.2. 角度二&#xff1a;GIF 模型的更新规则较为复杂多 4. 分析过程所用到的一系列 BrainPy 代码 0. 写在前面 前面介绍了: Hodgkin-…