0

0

Java 中使用枚举替代字符串 switch case 的完整实践指南

碧海醫心

碧海醫心

发布时间:2026-01-03 14:32:02

|

869人浏览过

|

来源于php中文网

原创

Java 中使用枚举替代字符串 switch case 的完整实践指南

本文详解如何用枚举(enum)安全、高效地替代基于字符串的 switch-case 逻辑,包括正确声明枚举、在 switch 中直接使用枚举常量,以及更优的“枚举内聚数据”设计模式——将业务值(如估算时间)直接封装进枚举中,彻底消除冗余分支。

在 Java 中,直接在 switch 语句中使用字符串字面量(如 "XS")虽可行,但存在类型不安全、易拼写错误、难以维护等缺陷。你尝试用 TShirtSize.XS.getValue() 替换字符串常量失败,根本原因在于:Java 的 switch 语句(自 JDK 7 起支持 String)仅允许 String 字面量或 enum 常量作为 case 标签,不支持任意表达式(如方法调用 getValue())。因此 case TShirtSize.XS.getValue(): 是语法错误。

✅ 正确做法分两步优化:

1. 使用枚举常量作为 switch case(需先完成字符串到枚举的转换)

首先定义简洁枚举(无需额外 value 字段):

public enum TShirtSize {
    XS, S, M, L, XL;
}

然后在业务代码中,先将字符串安全转换为枚举,再用其驱动 switch:

立即学习Java免费学习笔记(深入)”;

PDFlux
PDFlux

PDF内容提取+智能问答神器,结合了科研级精准的非结构化文档解析能力,以及ChatGPT的智能问答能力。

下载
try {
    TShirtSize size = TShirtSize.valueOf(item.getToString().trim().toUpperCase());
    double time = switch (size) {
        case XS -> 3.5;
        case S  -> 10.5;
        case M  -> 17.5;
        case L  -> 28.0;
        case XL -> 45.5;
    };
    estimatedTimes.add(time);
} catch (IllegalArgumentException e) {
    throw new IllegalArgumentException("不支持的尺码: " + item.getToString(), e);
}

⚠️ 注意:valueOf() 区分大小写且严格匹配名称,建议对输入做 trim() 和 toUpperCase() 预处理,并务必添加异常处理——这是使用 valueOf() 的强制要求。

2. 【推荐】将业务逻辑内聚到枚举中(消除 switch)

更优雅、更可维护的方案是:让枚举自身携带对应数值,完全避免条件分支:

public enum TShirtSize {
    XS(3.5), S(10.5), M(17.5), L(28.0), XL(45.5);

    private final double estimatedTime;

    TShirtSize(double estimatedTime) {
        this.estimatedTime = estimatedTime;
    }

    public double getEstimatedTime() {
        return estimatedTime;
    }

    // 可选:提供安全的字符串解析静态方法
    public static TShirtSize fromString(String str) {
        if (str == null || str.trim().isEmpty()) {
            throw new IllegalArgumentException("尺码字符串不能为空");
        }
        try {
            return valueOf(str.trim().toUpperCase());
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("无效的尺码值: " + str, e);
        }
    }
}

调用时一行解决,清晰、安全、无重复逻辑:

TShirtSize size = TShirtSize.fromString(item.getToString());
estimatedTimes.add(size.getEstimatedTime());

✅ 总结与最佳实践

  • ❌ 避免在 case 中使用方法调用(如 getValue())——编译不通过;
  • ✅ 优先采用 枚举内聚数据模式:将业务值(时间、系数、描述等)作为枚举构造参数,通过 getter 访问;
  • ✅ 使用 Enum.valueOf() 时,必须包裹 try-catch 或委托给自定义 fromString() 方法增强健壮性;
  • ✅ 枚举天然具备类型安全、IDE 自动补全、重构友好、线程安全单例等优势,是替代字符串常量的黄金标准;
  • ? 若未来需扩展(如增加中文名、图标路径),只需在枚举中新增字段和方法,零侵入现有调用逻辑。

通过以上重构,你的代码将从脆弱的字符串匹配,升级为强类型的、可验证的、易于演化的领域模型表达。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

566

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

440

2024.03.13

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

143

2023.12.26

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.6万人学习

Java 教程
Java 教程

共578课时 | 76.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号