24. 【Java】枚举:更安全的常量

Java的枚举类 一、概述 在jdk1.5之前,我们定义常量都是使用publicstaticfinal修饰的,较难管理这些常量 在jdk1.5之后引入了新的类型--枚举 枚举 用于定义有限数量的一组相同类型的常量 例如一年的四季:春、夏、秋、冬 例如错误的级别:低、中、高 可以把相关的常量分组到一个枚举类型里,枚举提供了比常量更多的方法 在枚举类型中定义的常量是该枚举类型的实例 二、枚举的使用 1、定义枚举的格式 权限修饰符enum枚举名称{ 实例1,实例2... 阅读详情

摘要: 本文深入讲解 Java 枚举(Enum)的核心概念与实战应用。从基础定义、内置方法、与 switch 的配合,到带字段和方法的“丰满”枚举、策略枚举等高级用法,全面剖析枚举如何替代传统常量,提升代码的类型安全性与可读性。文章通过丰富的代码示例,展示了枚举在状态管理、错误码设计、数据库映射等实际场景中的最佳实践,并对比了枚举与 final 常量的适用场景,帮助开发者掌握这一优雅且强大的语言特性。

关键词: Java 枚举, Enum, 类型安全, 策略枚举, 错误码设计


在编程的世界里,经常会遇到这样一类数据:它们只能在一组有限的、固定的值中选择。比如:

  • 星期几:只能是 MONDAY、TUESDAY、…、SUNDAY
  • 订单状态:只能是 待支付、已支付、已发货、已完成、已取消
  • 用户角色:只能是 管理员、普通用户、访客

在 Java 诞生之初,处理这类数据通常是用整数常量或字符串常量。比如:

public class Order {
    public static final int STATUS_PENDING = 0;
    public static final int STATUS_PAID = 1;
    public static final int STATUS_SHIPPED = 2;
    public static final int STATUS_DELIVERED = 3;
    public static final int STATUS_CANCELLED = 4;
}

这种方式虽然能用,但存在不少问题:

  • 类型不安全:你完全可以把一个 int 值(比如 99)赋给订单状态,编译器不会报错,但程序运行时可能崩溃。
  • 可读性差:数字 2 到底是“已发货”还是“已送达”?需要查文档或看注释。
  • 缺乏行为:这些常量只是数字,没法携带额外的信息(比如状态的中文名称、颜色、图标等)。

为了解决这些问题,Java 从 JDK 5 开始引入了 枚举(Enum)。枚举是一种特殊的类,它限定变量只能取一组预定义的常量值,同时还可以携带数据和行为。它让代码更安全、更清晰、更富有表现力。


1. 枚举的基础 —— 定义和使用

① 定义最简单的枚举

使用 enum 关键字定义枚举,枚举值之间用逗号分隔:

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}
② 使用枚举
Season current = Season.SPRING;
System.out.println(current);   // 输出:SPRING

枚举类型的使用非常直观,而且类型安全——你只能赋值枚举中定义的值,不能赋其他值。

// Season s = "SPRING";    // 编译错误,类型不匹配
// Season s = 1;           // 编译错误,类型不匹配

2. 枚举的内置方法

每个枚举类型都自动继承自 java.lang.Enum 类,因此自带一些实用的方法:

方法说明
name()返回枚举常量的名称(字符串),即定义时的文本
ordinal()返回枚举常量的序号(从 0 开始)
values()返回包含所有枚举值的数组,按定义顺序排列
valueOf(String)根据名称返回对应的枚举常量,如果不存在抛出 IllegalArgumentException
Season s = Season.SUMMER;

System.out.println(s.name());        // SUMMER
System.out.println(s.ordinal());     // 1
System.out.println(s.toString());    // SUMMER(和 name() 一样)

// 遍历所有枚举值
for (Season season : Season.values()) {
    System.out.println(season + " -> " + season.ordinal());
}
// 输出:
// SPRING -> 0
// SUMMER -> 1
// AUTUMN -> 2
// WINTER -> 3

// 根据字符串获取枚举
Season autumn = Season.valueOf("AUTUMN");
System.out.println(autumn);   // AUTUMN

// 无效的名称会抛异常
// Season invalid = Season.valueOf("FALL");  // IllegalArgumentException

⚠️ ordinal() 虽然可用,但不推荐依赖它做业务逻辑,因为一旦调整枚举值的顺序,代码逻辑可能被破坏。优先使用 name() 或自定义字段。


3. 枚举与 switch —— 完美拍档

枚举是 switch 语句的天然伙伴,因为 switch 的 case 分支可以直接使用枚举常量,而无需像整数那样写数字。

Season current = Season.WINTER;

String description = switch (current) {
    case SPRING -> "春暖花开";
    case SUMMER -> "夏日炎炎";
    case AUTUMN -> "秋高气爽";
    case WINTER -> "冬日暖阳";
};
System.out.println(description);   // 冬日暖阳

注意:在 switch 中,case 分支不需要写 Season.SPRING,直接写 SPRING 即可,因为编译器知道 switch 表达式的类型是 Season。


4. 带字段和方法的枚举 —— 让枚举“丰满”起来

简单枚举只有名称,但在实际开发中,我们通常需要为每个枚举值附加更多信息,比如中文名称、描述、颜色、代码等。

枚举可以拥有成员变量、构造方法、普通方法和 getter,就像普通类一样。

public enum OrderStatus {
    // 枚举值后面带参数,调用构造方法
    PENDING("待支付", "橙色"),
    PAID("已支付", "蓝色"),
    SHIPPED("已发货", "绿色"),
    DELIVERED("已送达", "灰色"),
    CANCELLED("已取消", "红色");

    // 成员变量
    private final String chineseName;
    private final String color;

    // 构造方法(必须是 private 的)
    OrderStatus(String chineseName, String color) {
        this.chineseName = chineseName;
        this.color = color;
    }

    // Getter 方法
    public String getChineseName() {
        return chineseName;
    }

    public String getColor() {
        return color;
    }

    // 还可以增加自定义方法
    public boolean isFinal() {
        return this == DELIVERED || this == CANCELLED;
    }
}

使用起来就很方便了:

OrderStatus status = OrderStatus.PAID;
System.out.println("状态:" + status.getChineseName());   // 已支付
System.out.println("颜色:" + status.getColor());        // 蓝色
System.out.println("是否终态:" + status.isFinal());      // false

📌 枚举的构造方法必须是 private 的(默认就是 private,你甚至可以省略不写)。因为枚举值是在枚举内部创建好的,外部不能通过 new 创建新的枚举实例。


5. 枚举的高级用法 —— 每个值可以有“个性化”行为

枚举的每个常量不仅仅是可以带数据,还可以各自重写方法,提供不同的行为。这有点像是为每个枚举常量定义了一个“匿名子类”。

public enum Operation {
    ADD {
        @Override
        public double apply(double a, double b) {
            return a + b;
        }
    },
    SUBTRACT {
        @Override
        public double apply(double a, double b) {
            return a - b;
        }
    },
    MULTIPLY {
        @Override
        public double apply(double a, double b) {
            return a * b;
        }
    },
    DIVIDE {
        @Override
        public double apply(double a, double b) {
            if (b == 0) {
                throw new ArithmeticException("除数不能为0");
            }
            return a / b;
        }
    };

    // 抽象方法,每个枚举常量必须实现
    public abstract double apply(double a, double b);
}

使用:

double x = 10, y = 5;
System.out.println(Operation.ADD.apply(x, y));      // 15.0
System.out.println(Operation.SUBTRACT.apply(x, y)); // 5.0
System.out.println(Operation.MULTIPLY.apply(x, y)); // 50.0
System.out.println(Operation.DIVIDE.apply(x, y));   // 2.0

这种模式在《Effective Java》中被推荐用于实现“策略枚举”(Strategy Enum)。它让枚举不仅定义常量,还封装了行为,非常优雅。


6. 枚举与常量 —— 什么时候用哪个?

我们之前学过 final 常量,它和枚举都可以用来表示固定值。如何选择呢?

对比维度final 常量(如 public static final int STATUS_PENDING = 0)枚举(enum)
类型安全❌ 差,可以赋任意同类型值✅ 强,只能取枚举中定义的值
可读性较差,数字没有意义✅ 好,枚举名称本身有意义
携带额外数据❌ 不能,除非用多个常量配合数组✅ 可以,每个枚举值可以带多个字段
行为封装❌ 无法封装方法✅ 可以有方法和抽象方法
性能轻量(基本类型)略重(对象)
使用场景简单的纯数值,且安全要求不高任何有固定选项的业务场景

经验法则:

  • 如果只是单纯表示一个数字或字符串,且不会扩展信息,可以用 final 常量。
  • 如果有一组固定选项,且需要关联额外的数据或行为,一定要用枚举。
  • 在日常企业级开发中,枚举的使用频率远高于 final 常量,因为它更安全、更富有表现力。

7. 枚举的应用场景 —— 实战中的常见用法

① 在 DTO/实体中作为字段类型
public class Order {
    private String orderId;
    private OrderStatus status;
    // ...
}

通过枚举限制状态的值,确保数据一致性。

② 数据库映射

在 JPA 中,枚举可以映射到数据库的 VARCHAR 或 INT 列:

@Enumerated(EnumType.STRING)  // 存储枚举名称
private OrderStatus status;
③ 接口参数校验

如果你写了一个 API 接口,参数为枚举类型,Swagger/OpenAPI 会自动生成下拉选项,前端可以很方便地选择,减少输入错误。

④ 国际化

枚举可以携带多语言字段,配合资源文件实现国际化展示。


8. 枚举的陷阱与注意事项

  • 枚举不可继承:枚举默认继承 java.lang.Enum,不能有子类,也不能继承其他类。
  • 枚举实例是单例的:每个枚举常量在 JVM 中只有一个实例,可以通过 == 比较,而且比 equals() 更安全(因为枚举常量是唯一实例)。
  • 不要过度使用枚举:如果枚举值经常变化(比如从外部配置加载的列表),就不适合用枚举,因为枚举值是硬编码的。
  • 序列化安全:枚举的序列化机制特殊,可以保证反序列化后仍然是单例,所以在分布式系统中用枚举做常量很安全。
  • 枚举的 values() 方法返回的数组是新拷贝的,每次调用都会创建新数组,不会修改内部缓存。

9. 综合示例 —— 一个实用的枚举应用

我们来实现一个“错误码”枚举,它承载了错误码、错误信息、严重程度,还能根据错误码查找对应的枚举。

public enum ErrorCode {
    // 枚举值及其关联数据
    SUCCESS(0, "成功", Severity.INFO),
    BAD_REQUEST(400, "请求参数错误", Severity.WARNING),
    UNAUTHORIZED(401, "未认证", Severity.ERROR),
    FORBIDDEN(403, "无权限访问", Severity.ERROR),
    NOT_FOUND(404, "资源不存在", Severity.WARNING),
    INTERNAL_ERROR(500, "服务器内部错误", Severity.CRITICAL),
    SERVICE_UNAVAILABLE(503, "服务不可用", Severity.CRITICAL);

    // ---- 枚举的成员字段 ----
    private final int code;
    private final String message;
    private final Severity severity;

    // 嵌套枚举:严重程度
    public enum Severity {
        INFO, WARNING, ERROR, CRITICAL
    }

    // ---- 构造方法 ----
    ErrorCode(int code, String message, Severity severity) {
        this.code = code;
        this.message = message;
        this.severity = severity;
    }

    // ---- Getter ----
    public int getCode() { return code; }
    public String getMessage() { return message; }
    public Severity getSeverity() { return severity; }

    // ---- 根据错误码查找枚举 ----
    public static ErrorCode fromCode(int code) {
        for (ErrorCode ec : ErrorCode.values()) {
            if (ec.code == code) {
                return ec;
            }
        }
        throw new IllegalArgumentException("未知错误码: " + code);
    }

    // ---- 判断是否为严重错误 ----
    public boolean isCritical() {
        return this.severity == Severity.CRITICAL;
    }

    // ---- 重写 toString 提供更友好的输出 ----
    @Override
    public String toString() {
        return String.format("[%d] %s (%s)", code, message, severity);
    }
}

使用示例:

public class Main {
    public static void main(String[] args) {
        // 1. 直接使用
        ErrorCode error = ErrorCode.NOT_FOUND;
        System.out.println(error);   // [404] 资源不存在 (WARNING)
        System.out.println("严重?" + error.isCritical());  // false

        // 2. 根据 code 查找
        ErrorCode found = ErrorCode.fromCode(500);
        System.out.println("根据 500 查到:" + found.getMessage());

        // 3. 遍历所有错误码
        for (ErrorCode ec : ErrorCode.values()) {
            System.out.println(ec + " -> 严重程度: " + ec.getSeverity());
        }

        // 4. 在 switch 中使用
        switch (error) {
            case NOT_FOUND -> System.out.println("请检查请求路径");
            case BAD_REQUEST -> System.out.println("请检查请求参数");
            default -> System.out.println("其他错误");
        }
    }
}

这个例子充分展示了枚举在实际项目中的实用价值:既有数据,又有行为,还类型安全,且易于维护。


10. 今天的总结

今天我们全面学习了枚举:

  • 枚举:用 enum 定义一组固定的常量,类型安全,有明确语义。
  • 内置方法:name()、ordinal()、values()、valueOf()。
  • 与 switch 配合:简洁直观,编译器帮你检查穷尽性。
  • 带字段和方法的枚举:给枚举值附加额外信息,并封装行为。
  • 策略枚举:每个枚举值可以有不同的方法实现,适合封装算法。
  • 与 final 常量的对比:枚举在类型安全、可读性、扩展性上更优。
  • 实际应用场景:状态、错误码、角色、类型等无处不在。

枚举是一种“优雅”的编程方式,它让常量不再“裸奔”,而是有了自己的身份和灵魂。在企业级开发中,合理使用枚举能极大提升代码的可维护性和可读性。


动手试试

  1. 定义一个 DayOfWeek 枚举,包含星期一到星期日。给每个枚举值增加一个中文名称字段(如 "星期一"),并在 main 中遍历输出。

  2. 定义一个 TrafficLight 枚举,包含 RED、YELLOW、GREEN。为每个值增加一个 action() 方法,返回对应的提示(如 RED -> “停止”,YELLOW -> “等待”,GREEN -> “通行”)。用策略枚举的方式实现。

  3. 写一个 HttpStatus 枚举,包含常见的 HTTP 状态码(200、301、400、401、404、500 等),每个状态码关联一个标准描述信息(如 200 -> “OK”)。添加一个 fromCode 静态方法,根据状态码查找枚举,如果找不到则返回 null。

  4. (挑战)结合第 16 篇的计算器项目,把运算类型用枚举重构。定义一个 OperationType 枚举,每个枚举值同时实现 double apply(double a, double b) 方法。这样主菜单可以直接使用 OperationType.values() 动态生成,新增运算只需添加一个枚举值,完全符合开闭原则。

枚举的内容讲完了,下一篇文章我们会进入异常处理的世界。程序总会出错,关键是如何优雅地处理错误,让程序更健壮、更友好。

我们下一篇见。😃

📌 获取本系列示例代码请访问 GitCode。

Java枚举详解与实战示例 Java枚举(Enum)是Java 5中引入的一种全新类型,专门用于表示固定数量的常量集合。与传统的常量定义方式相比,枚举具备更强的类型安全性、可读性和可维护性。每个枚举值本质上都是该枚举类的一个实例,并且默认继承自类。枚举类与普通类的主要区别在于:枚举类的实例是预先定义好的、有限的,不能在运行时动态创建;而普通类可以通过构造函数创建多个对象。此外,枚举天然支持序列化、比较、线程安全等特性,非常适合用于表示状态、选项、命令类型等不变的集合数据。 阅读详情

相关推荐

【Java】枚举与注解篇

枚举类型和注解类型是 Java 语言中非常强大且实用的特性,它们各自有着独特的设计目的和应用场景。枚举类型通过提供类型安全的常量集合,使代码更加清晰、易读和健壮;注解类型则通过为代码添加元数据信息,实现了代码的灵活配置和功能扩展。在实际开发中,合理运用枚举类型和注解类型可以提高代码的可维护性、可扩展性和开发效率。开发者可以根据具体的需求,将枚举类型和注解类型结合使用,创造出更加高效、优雅的 Java 程序。

m0_72516377的博客 1264

Java基础知识之枚举和常量

枚举用法 常量 在JDK1.5 之前,我们定义常量都是: public static fianl… 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 public enum Color { RED, GREEN, BLANK, YELLOW } switch enum Signal { GREEN, YELLOW, RED } public class TrafficLight { Signal color = Si

梦想是很难很难的,所以先勇敢一点 2249

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2630

详解Java枚举

本例和上例的执行结果完全相同。

xiaocai 1597

2025 年国人友好神刊盘点:20 本审稿快、分区高的 SCI 期刊,速抢发文先机!

科睿唯安最新发布的 2024 年影响因子(2025 年公布)显示,多本 TOP 期刊影响因子迎来大幅上涨!尤其是对国人友好的期刊,因审稿效率高、版面费亲民、国人发文占比超 40%,成为科研人员投稿热门。本文精选 20 本潜力神刊,涵盖Cell 子刊、顶流期刊、黑马期刊、性价比之王及新晋分区 TOP,附完整的影响因子、中科院分区、审稿周期、收稿方向攻略,助你抢占发文先机!

good_rrrrr的博客 5556

Ubuntu虚拟机磁盘扩容实战:5分钟搞定gparted分区调整(附常见错误修复)

本文详细介绍了在Ubuntu虚拟机中使用gparted工具进行磁盘扩容的实战步骤。针对常见的交换分区阻碍问题,提供了从禁用交换空间、删除旧分区、调整主分区大小到重建交换分区并更新系统配置的完整解决方案,帮助用户在5-10分钟内安全高效地解决磁盘空间不足的难题。

1a2s3d4f5g的博客 669

Java 枚举(enum)常用操作笔记

Java 枚举(enum)的常用操作

IQ_Kuo的博客 1142

windows中如何将已安装的nodejs高版本降级为低版本

第一步:先清空本地安装的node.js版本 1.按健win+R弹出窗口,键盘输入cmd,然后敲回车(或者鼠标直接点击电脑左面最左下角的win窗口图标弹出,输入cmd再点击回车键) 然后进入命令控制行窗口,并输入where node查看之前本地安装的node的路径 2.找到上面找到的路径,将node.exe所在的父目录里面的所有东西都删除 3.为了彻底删除之前安装的node.js,鼠标点击电脑左面最左下角的win窗口图标弹出,输入“控制面板”再点击回车键进入,进入控制面板后,找到所安装的node.js并

weixin_44582077的博客 9万+

Java枚举(enum)和常量

Java枚举和常量的常用写法

Java程序媛,欢迎大家一起交流学习~ 3042

Android应用之【巧妙隐藏桌面图标的进阶方案】

本文详细探讨了Android应用中隐藏桌面图标的进阶方案,解决了传统方法在Android 10及以上版本中出现的黑色图标残留问题。通过Intent-Filter配置和厂商适配技巧,实现子应用真正隐身,同时确保主应用正常启动。适用于企业工具套件、模块化系统等场景,提升用户体验和安全性。

weixin_28363123的博客 504

JasperReport制作行内容合并的表格

效果图: 实现思路一: 交叉表 另一个思路: 普通表格 缺点:无法实现内容 垂直居中显示 准备工作 一、数据准备 DROP TABLE IF EXISTS `address_item_sex_value`; CREATE TABLE `address_item_sex_value` ( `id` int(11) NOT NULL AUTO_INCREM...

weixin_34148456的博客 2465

java枚举后面括号是什么意思_[Java] Java自定义枚举常量后括号的作用

Java核心技术Ⅰ中提到了枚举类自定义分方法,在示例代码中,定义enum Size类代码如下enum Size{SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");private Size(String abbreviation) { this.abbreviation = abbreviation;}public String getAb...

weixin_34660766的博客 2074

【ROS2】RViz2加载URDF模型文件

1)运行RViz2rviz22)添加组件:RobotModel3)选择通过文件添加4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可

郭老二 1450

《写出可维护的 Java 枚举:从简单常量到策略封装的演化之路》

枚举(Enum)是Java 5引入的一种特殊数据类型,它允许我们定义一组命名的常量。这里我们定义了一个表示星期的枚举,简单吧?😉枚举不仅仅是常量集合,它可以有属性、方法、构造器枚举可以实现接口和抽象方法,实现多态行为枚举是实现单例模式的最佳方式枚举可以优雅地实现策略、状态、命令等设计模式EnumSet和EnumMap是处理枚举集合的高效工具枚举非常适合实现状态机等固定状态流转的场景枚举是Java中一个被低估的特性,用好了可以让代码更安全、更简洁、更优雅!

龚小帅的博客 1369

Halcon 色彩标定:RGB空间下实现白平衡与CCM矩阵合成静态HDR图像

摘要 本文介绍了一种基于Halcon的色彩校正方法,结合白平衡与灰轴约束最小二乘法实现精准颜色还原。方法分为三步:1)自动定位色卡区域并提取灰阶块计算白平衡增益;2)通过前三列色块建立测量值与标准值的映射关系;3)引入灰轴约束条件求解色彩校正矩阵(CCM),确保中性灰区域不偏色。算法采用中位数计算白平衡增益以提高鲁棒性,并通过旋转校正处理色卡倾斜问题。实验表明,该方法能有效消除相机采集的系统色偏,适用于颜色测量、表面检测等机器视觉场景。文末提供了完整代码实现。

LIN943168247的博客 404

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java中定义枚举常量

Java中定义枚举常量 枚举(Enum)是一种特殊的类,它包含了固定数量的常量。在Java中,使用枚举可以提高代码的可读性和可维护性。本文将详细介绍如何在Java中定义枚举常量。 定义枚举的步骤 下面是定义枚举的步骤,以及每一步需要做的事情: 步骤 描述 1 定义枚举类型 2 列出枚举常量 3 为枚举...

weixin_40465137的博客 458

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

枚举-特定于常量方法的实现及策略枚举

文章目录一、最常用的用法二、特定于常量的方法实现三、策略枚举Strategy enum 各位读者盆友,晚上好。这里分享下枚举的2种不常见的用法。 代码示例来源于 Thrid Edition [美] Joshua Bloch 余黎敏译 一、最常用的用法 常见的多事枚举加个构造方法,然后根据所需用即可。eg: package com.chm.effectivejava.myenum; /** ...

起舞的日子 627

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java 枚举与泛型

Java 枚举 之前写过的文档:https://blog.csdn.net/Roobert_Chao/article/details/78637972

RobertChao的博客 5120

java如何定义枚举数字常量

Java中定义枚举数字常量及其在饼状图中的应用 在Java中,枚举(Enum)是一种特殊的类,它可以用来定义一组常量。这些常量通常用于表示一组固定的值,比如星期、月份、方向等。本文将介绍如何在Java中定义枚举数字常量,并展示如何将这些常量应用于饼状图的生成。 定义枚举数字常量 首先,我们定义一个枚举类,用来表示一组数字常...

weixin_42376793的博客 350

8. 【Java】常量、字面量和枚举

本文深入解析 Java 中表示"不变值"的三个核心概念:字面量、常量和枚举。字面量是直接写在代码中的原始数据值;常量通过 `final` 关键字锁定不可变变量,提高代码可维护性;枚举则用于定义一组有限的、类型安全的固定选项集合。理解这三者的区别与适用场景,有助于编写更清晰、健壮且易于维护的 Java 代码。

gugucoding的博客 510

使用枚举替代整型常量

《Java枚举与整型常量模式的比较》 整型常量模式存在严重缺陷:缺乏类型安全性导致跨类型比较运算,命名空间污染需人工前缀维护,修改常量值需重新编译客户端代码,且调试时无法获得有意义的表示。字符串常量变体则带来更严重的运行时风险。 Java枚举完美解决了这些问题:作为完整类类型,枚举提供编译时类型检查、独立命名空间和丰富内置功能。其面向对象特性支持字段存储、方法实现和接口继承,通过构造函数初始化数据关联。高级模式如策略枚举和常量特定方法实现,使枚举能灵活处理复杂业务逻辑,成为类型安全的理想解决方案。枚举的va

静水深流 150

Java枚举括号值_[Java] Java自定义枚举常量后括号的作用

Java核心技术Ⅰ中提到了枚举类自定义分方法,在示例代码中,定义enum Size类代码如下enum Size{SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");private Size(String abbreviation) { this.abbreviation = abbreviation;}public String getAb...

weixin_31862047的博客 629

Java 枚举最佳实践:从《Effective Java》提炼的 4 条黄金法则

枚举类型是一种特殊数据类型,它使变量只能取一组预定义的常量值。变量必须等于为其预定义的值之一。常见例子包括指南针方向(NORTH、SOUTH、EAST、WEST)、星期几等。

sashimi1984xp1的博客 607

Java——枚举类

枚举类是Java中用于定义固定常量集合的强大工具,具有类型安全、可读性高、扩展性强等优点。它适用于表示一组有限的、固定的值,并且可以包含字段、方法和构造器。在实际开发中,枚举类常用于状态机、策略模式、单例模式等场景。

2301_80215285的博客 709

Error:(63, 24) 错误: 枚举 switch case 标签必须为枚举常量的非限定名称

错误描述: Error:(63, 24) 错误: 枚举 switch case 标签必须为枚举常量的非限定名称。 项目当中用到了饼状图,所以用到了开源的图表库,功能相当强大,传送门:XCL_Charts。 这是里面的部分代码: 虽然知道解决办法,也有提醒,因为平时不怎么用枚举。所以出现问题的时候也是不太懂了。 解决思路: 那就是查原因咯。 ​switch ca...

陈胖子的博客 5252

Java:Effective java学习笔记之 用enum代替int常量

Java 用enum代替int常量用enum代替int常量1、用enum构建2、enum枚举常量与数据关联3、枚举常量与行为关联4、枚举策略模式5、总结参考 用enum代替int常量 在枚举类型出现之前,一般都常常使用int常量或者String常量表示列举相关事物。如: public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_S

JMW1407的博客 740
上一篇: 23. 【Java】内部类与静态嵌套类
下一篇: 25. 【Java】异常处理:让程序更健壮
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值