当前位置: 首页 > news >正文

枚举的定义及其使用

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

1. 枚举的基本定义

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

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

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

2. 枚举的基本使用

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

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. 枚举可以有字段和方法

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

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()方法返回包含所有枚举常量的数组。你可以用它来遍历所有的枚举常量。

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

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

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

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

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

5. 枚举的构造函数

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

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语句可以确保只有枚举类型的常量才能用于比较。

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中轻松地表示一组常量,并且可以附加更多的逻辑,极大地增强了代码的可读性和可维护性。

相关文章:

  • 《齿轮咬合水分子:Relax Max如何用潜艇科技重构卫浴动力系统》​
  • 科技赋能安全:慧通测控的安全带全静态性能测试
  • STM32学习笔记之常用总线(原理篇)
  • 分布式节点池:群联云防护抗DDoS的核心武器
  • 大摩闭门会:250321 学习总结报告
  • 从实践到创新:低代码驱动教育行业数字化转型
  • 田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)
  • 【Vitis AIE】FPGA图像处理 11 双线性插值 Bilinear Interpolation
  • 硬件学习笔记--52 DC-DC Buck同步整流和异步整流介绍
  • 【Git流程最佳实践】 开发较大功能时应使用project branch
  • 什么是模型上下文协议 (MCP)?与 API 相比,它如何简化 AI 集成?
  • Meta Platforms Inc.(原Facebook)2024-2025 年最新发展深度分析报告
  • 第2.2节 Android Jacoco插件覆盖率采集
  • 用 pytorch 从零开始创建大语言模型(零):汇总
  • 轻松迁移 Elasticsearch 数据:如何将自建索引导出并导入到另一个实例
  • 通过 Executors 创建线程池
  • Java基础编程练习第35题-可实现多种排序的Book类(PTA练习题)
  • 第十六届蓝桥杯模拟二
  • PowerBI 条形图,解决数据标签在条形内部看不清的问题
  • DeepSeek R1 本地部署指南 (2) - macOS 本地部署
  • 江西贵溪:铜板上雕出的国潮美学
  • 美凯龙:董事兼总经理车建兴被立案调查并留置
  • 男子退机票被收票价90%的手续费,律师:虽然合规,但显失公平
  • 媒体谈法院就“行人相撞案”道歉:执法公正,普法莫拉开“距离”
  • 1至4月全国铁路完成固定资产投资1947亿元,同比增长5.3%
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体