Java中枚举的toString()和name()区别小结

 更新时间:2025年08月15日 10:15:43   作者:布朗克168  
本文主要介绍了Java中枚举的toString()和name()区别小结,name()返回原始名称,不可重写;toString()可重写以提供更友好的描述,二者用于不同场景,下面就来具体了解一下

一、引言

在 Java 里,枚举类型是一种特殊的类,toString() 与 name() 方法都和枚举常量有关,但它们存在一些区别,下面为你详细介绍

二、介绍

  1. name() 方法
    定义:name() 是 java.lang.Enum 类里的一个方法,所有枚举类型都能继承该方法。它的作用是返回枚举常量的名称,也就是在枚举声明中定义的标识符。
    特点:返回值是固定的,不会受 toString() 方法重写的影响,始终返回枚举常量在代码中定义的原始名称。
  2. toString() 方法
    定义:toString() 是 java.lang.Object 类中的方法,所有 Java 类都有该方法。在枚举类型中,默认情况下,toString() 方法的行为和 name() 方法一样,会返回枚举常量的名称。不过,你可以重写这个方法,让它返回更具描述性的字符串。
    特点:可以根据需求重写,从而返回更有意义的信息,而不局限于枚举常量的原始名称。
    下面的示例展示了 name() 和 toString() 方法的使用:
// 定义一个表示季节的枚举
enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;

    // 重写 toString() 方法,让其返回更具描述性的字符串
    @Override
    public String toString() {
        switch (this) {
            case SPRING:
                return "春季";
            case SUMMER:
                return "夏季";
            case AUTUMN:
                return "秋季";
            case WINTER:
                return "冬季";
            default:
                return super.toString();
        }
    }
}

public class EnumExample {
    public static void main(String[] args) {
        Season season = Season.SPRING;

        // 使用 name() 方法获取枚举常量的原始名称
        System.out.println("name() 方法返回: " + season.name());

        // 使用 toString() 方法获取枚举常量的字符串表示
        System.out.println("toString() 方法返回: " + season.toString());
    }
}

在 Season 枚举中,重写了 toString() 方法,让它返回中文的季节名称。

  • 在 main 方法里,先创建了一个 Season 枚举类型的变量 season,并将其赋值为 SPRING。
  • 调用 name() 方法时,返回的是枚举常量的原始名称 SPRING。
  • 调用 toString() 方法时,由于重写了该方法,返回的是更具描述性的字符串 春季。

三、使用场景

在实际开发中,重写枚举的 toString() 方法通常是为了提供更具可读性、更符合业务需求的字符串表示,以下是一些常见的使用场景:

  1. 增强用户界面的显示效果

当需要将枚举值展示给用户时,默认的枚举常量名称可能不够友好。通过重写 toString() 方法,可以提供更具描述性的文本,提升用户体验。
示例:

enum Gender {
    MALE,
    FEMALE;

    @Override
    public String toString() {
        switch (this) {
            case MALE:
                return "男性";
            case FEMALE:
                return "女性";
            default:
                return super.toString();
        }
    }
}
  • 在用户界面中显示性别时,直接使用 Gender.MALE.toString() 会显示 “男性”,而不是 “MALE”,这对用户来说更直观易懂。
  1. 日志记录和调试

在日志记录和调试过程中,更具描述性的枚举值表示有助于快速定位问题。重写 toString() 方法可以让日志信息更清晰。
示例:

enum OrderStatus {
    CREATED,
    PAID,
    SHIPPED,
    COMPLETED;

    @Override
    public String toString() {
        switch (this) {
            case CREATED:
                return "订单已创建";
            case PAID:
                return "订单已支付";
            case SHIPPED:
                return "订单已发货";
            case COMPLETED:
                return "订单已完成";
            default:
                return super.toString();
        }
    }
}
  • 在记录订单状态变化的日志时,使用 OrderStatus.PAID.toString() 可以记录 “订单已支付”,这样的日志信息更具可读性。
  1. 数据序列化和反序列化

在将枚举值序列化为字符串或从字符串反序列化时,可能需要自定义的字符串表示。重写 toString() 方法可以确保序列化和反序列化过程中使用的字符串符合业务需求。
示例:

enum PaymentMethod {
    CREDIT_CARD,
    PAYPAL,
    ALIPAY;

    @Override
    public String toString() {
        switch (this) {
            case CREDIT_CARD:
                return "信用卡支付";
            case PAYPAL:
                return "PayPal支付";
            case ALIPAY:
                return "支付宝支付";
            default:
                return super.toString();
        }
    }
}
  • 在将支付方式信息存储到数据库或传输到其他系统时,使用自定义的字符串表示可以提高数据的可读性和兼容性。
  1. 与外部系统交互

当与外部系统(如第三方 API、配置文件等)进行交互时,可能需要使用特定格式的字符串来表示枚举值。重写 toString() 方法可以确保与外部系统的交互顺利进行。
示例:

enum Currency {
    USD,
    EUR,
    CNY;

    @Override
    public String toString() {
        switch (this) {
            case USD:
                return "美元";
            case EUR:
                return "欧元";
            case CNY:
                return "人民币";
            default:
                return super.toString();
        }
    }
}
  • 在与支持多种货币的外部支付系统交互时,使用自定义的字符串表示可以避免因枚举常量名称不一致而导致的问题。

四、使用场景

  • 本质特性和使用场景有别虽然默认情况下返回结果相同,但 name() 和 toString() 在本质特性和使用场景上是有差异的:
  • name() 方法:这是 Enum类特有的方法,返回的是枚举常量在代码中定义的原始名称,且这个返回值是固定不变的,不能被重写。它主要用于一些需要严格匹配枚举常量原始名称的场景,比如反序列化操作、配置文件读取等。
  • toString() 方法:这是 Object 类的方法,所有 Java类都有该方法。在枚举中,它默认返回枚举常量的名称,但可以根据业务需求重写,以提供更具描述性的信息。它常用于面向用户的展示、日志记录等场景。
  • 不重写 toString() 方法时,它和 name()方法的返回结果一样,但两者的设计目的和使用场景不同。若你需要根据具体业务情况提供更友好、更具描述性的枚举常量表示,就应该重写toString() 方法。

 到此这篇关于Java中枚举的toString()和name()的使用区别小结的文章就介绍到这了,更多相关Java 枚举toString()和name()区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java大话之创建型设计模式教程示例

    java大话之创建型设计模式教程示例

    这篇文章主要为大家介绍了java大话之创建型设计模式教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JavaEE多线程中阻塞队列的项目实践

    JavaEE多线程中阻塞队列的项目实践

    本文主要介绍了JavaEE多线程中阻塞队列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 一次Jvm old过高的排查过程实战记录

    一次Jvm old过高的排查过程实战记录

    这篇文章主要给大家介绍了一次Jvm old过高的排查过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • struts2中实现多个文件同时上传代码

    struts2中实现多个文件同时上传代码

    struts2中实现多个文件同时上传代码,需要的朋友可以参考一下
    2013-04-04
  • 详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    本篇文章主要介绍了详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-11-11
  • JAVA中哈希表HashMap的深入学习

    JAVA中哈希表HashMap的深入学习

    这篇文章主要介绍了哈希表HashMap的深入学习,哈希表是一种非常重要的数据结构,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中HashMap的实现原理进行讲解。感兴趣的话可以一起来学习
    2020-07-07
  • Java注解方式之防止重复请求

    Java注解方式之防止重复请求

    这篇文章主要介绍了关于Java注解方式防止重复请求,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    在IDEA中就提供了一个帮助你回退代码的机会,但这个方法并不是万能的,好了,下面就来具体说说IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法,感兴趣的朋友一起看看吧
    2022-04-04
  • SpringBoot多租户配置与实现示例

    SpringBoot多租户配置与实现示例

    本文详细介绍了在SpringBoot中实现多租户架构的方法和步骤,包括配置数据源、Hibernate拦截器、租户解析器等,以共享数据库、共享数据表的方式,确保数据隔离和安全性,感兴趣的可以了解一下
    2024-09-09
  • HttpClient HttpRoutePlanner接口确定请求目标路由

    HttpClient HttpRoutePlanner接口确定请求目标路由

    这篇文章主要为大家介绍了使用HttpClient HttpRoutePlanner接口确定请求目标路由,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论