枚举:如何正确使用name()和toString()方法

两种方法之间的区别?

Java枚举有两种方法来检索枚举常量的值: name().toString()toString()方法调用name()方法,该方法返回枚举常量的字符串表示形式。 在清单1中,通过在Animal.DOG常量方法上调用name()toString()返回的值是DOG

清单1:动物枚举

public enum Animal {DOG
}// Unit test
assertThat(DOG.toString()).isEqualTo(DOG.name());

因此,鉴于两种方法都返回相同的值,您可能会认为它们可以互换使用,并且在大多数情况下,这是正确的。 但是,这两种方法之间的区别很重要。

有什么不同?

name()方法是最终的,因此不能被覆盖,相反, toString()方法是打开的并且可以被覆盖。 实际上,鼓励重写toString()方法。 应该实现它并返回友好的枚举常量版本。 清单2显示了如何完成此操作。

清单2:覆盖toString()方法

public enum Animal {DOG {public String toString() {return "Dog";}}
}// Unit test
assertThat(DOG.toString()).isNotEqualTo(DOG.name());

Animal.DOG枚举常量上调用toString()的输出为Dog 。 因此,现在name()方法和toString()方法不会返回相同的值。

Java文档怎么说

让我们更深入地研究一下Java文档,该文档建议:

大多数程序员应该优先于name()方法使用toString()方法,因为toString()方法可能返回更用户友好的名称。

这就提出了一个问题。 什么时候应该使用.name()方法?

根据Java文档:

name()方法主要设计用于特殊情况,在这些情况下正确性取决于获得确切的名称,而不同的发布版本之间并不会有所不同。

那么他们指的是什么特殊情况? valueOf()方法可能会给我们提示。 此方法采用String值,并尝试查找与之完全匹配的枚举。 看一下清单3中的代码。

清单3:valueOf()方法返回DOG

assertThat(DOG).isEqualTo(Animal.valueOf("DOG"));

传递给valueOf()方法的String值必须与枚举常量完全匹配,否则将引发IllegalArgumentException

源代码

本文的代码示例和单元测试存储在GitHub存储库ReadLearnCode / readlearncode_articles中 。

结论

当基于字符串值填充枚举字段时,这是一种非常有用的方法。 何时执行此操作的一个示例是在反序列化包含枚举常量的JSON文档时。 在这种情况下,应使用name()方法以保持往返等效性。

您不能保证toString()方法不会被覆盖,但是name()方法将始终返回枚举的字符串等效项。

进一步阅读

您可能对我的文章“策略模式的枚举实现”感兴趣。

翻译自: https://www.javacodegeeks.com/2017/09/enum-use-name-tostring-methods-correctly.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle maven_Gradle – Maven的观点

gradle maven正如我博客的读者所知道的, 我有点像Maven迷 。 我从2007年8月左右开始使用Maven,从没有回过头。 但是,与其他所有情况一样,“变化是唯一的常数”。 现在这个领域还有其他参与者,Gradle似乎是最有前途的。…

JDK 9中已弃用Java的Observer和Observable

在博客文章《 应用JDK 9 Deprecated增强功能》中 ,我讨论了JDK 9中 Deprecated批注中对forRemoval()和since()可选元素(方法)的添加 。 我在那篇文章中说:“在Java SE API上应用新的…

理解依赖注入(IOC)和学习Unity

IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection)。 作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调…

java中怎样验证重复文件_java – 如何在下载之前检查URL中的重复文件

如果您有基本URL并存储具有相同文件名的文件.由于文件修改时间和If-Modified-Since HTTP Header,您可以询问服务器是否值得再次下载映像.File f new File();// the file to downloadHttpURLConnection con (HttpURLConnection) new URL("http://www.test.com/"f.ge…

Jason是炮王

Jason是炮王 转载于:https://www.cnblogs.com/TankJam/p/11203636.html

事件传递 java_将事件传递/发送到父组件?

在Angular中,我可以创建一个发出动作的子组件:Component({...template: Click Me})export class ChildComponent {Output() onChildAction new EventEmitter();childAction() {this.onChildAction.emit();}}以及处理它的父组件 . 就像是:Com…

mongodb身份验证_MongoDB身份验证

mongodb身份验证我最近更新了Mongometer ,使其更加灵活。 发布新版本后不久,其中一位用户通过在帖子中发表评论来反馈问题。 我启动了我的机器,打开了我的IDE,发现了问题,并在半小时内将修补程序推送到了github 。 这不…

mysql列类型

http://hi.baidu.com/b37798969/item/429fb25f838f1d3233e0a99b MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供…

Java13的API_JAVA基础--JAVA API常见对象(其他API)13

一、其他API1.System类system类中的方法和成员变量都是静态的, 不需要创建System对象就可以直接使用。1 /*2 * 演示System的使用3 */4 public classSystemDemo {5 public static voidmain(String[] args) {67 /*8 * System类中的静态成员变量: out 和 er…

适用于Java开发人员的Elasticsearch:简介

本文是我们学院课程的一部分,该课程的标题为Java开发人员的Elasticsearch教程 。 在本课程中,我们提供了一系列教程,以便您可以开发自己的基于Elasticsearch的应用程序。 我们涵盖了从安装和操作到Java API集成和报告的广泛主题。 通过我们简…

人民邮电出版社图灵公司的两本SQL Server 2005图书诚征译者

人民邮电出版社图灵公司介绍(来自http://www.turingbook.com/) 北京图灵文化发展有限公司成立于2005年6月,由人民邮电出版社投资控股,以策划出版高质量的科技书籍为核心业务,主要出版领域包括计算机、电子电气、数学统…

java容器类继承_JAVA容器 - weslie - OSCHINA - 中文开源技术交流社区

一、 数组1、数组是保存一组对象的最有效的方式。但数组有固定的尺寸而受限(p216)2、数组与其他种类的容器之间的区别有三方面:效率、类型和保存基本类型的能力。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性…

前端通信

Node中的net模块提供的前端通信 H5提供的 webSocket 【 常用于 移动端 】pc端低版本浏览器使用 socket.io 通信- 服务端: 总的服务器 举例: 腾讯的qq服务器 1个整体- 客户端: 单个用户使用应用 举例: 每个人的qq 多个client.js 客…

java定位线程阻塞_Arthas - 定位 Java 性能问题原来这么简单

目录:一、Arthas 介绍二、Arthas 使用场景三、Arthas怎么使用四、Arthas 定位性能问题定位Java代码导致占用CPU高的问题线程死锁前言:在做性能测试的过程中,当遇到Java性能问题,比如CPU飙升,负载突高,内存溢…

SVN 本地文件锁/服务端文件锁清除步骤

1.本地文件锁,直接cleanup,cleanup界面选择break locks即可 2.服务端文件锁,本地文件右击没有release lock或者break lock的选项时 方法1:右键,svn选择browser repo,找到该文件,右击&#xff0c…

java 对象复活_Java对象复活

java 对象复活总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理。 如果您复活了物体,会发生什么? 何时定案&#xff…

a b和c 15 java_1011. A+B和C (15)

给定区间[-231, 231]内的3个整数A、B和C&#xff0c;请判断AB是否大于C。输入格式&#xff1a;输入第1行给出正整数T(<10)&#xff0c;是测试用例的个数。随后给出T组测试用例&#xff0c;每组占一行&#xff0c;顺序给出A、B和C。整数间以空格分隔。输出格式&#xff1a;对…

深入浅出《设计模式》之工厂模式(C++)

前言 模式介绍 在之前简单工厂模式中&#xff0c;我们介绍了简单工厂模式的缺陷是违背了开放-封闭原则。如果在面馆中添加了烤海参&#xff0c;那将会修改waiter工厂类。违背了类内封闭原则。 还以面馆为例&#xff0c;现在两种面&#xff0c;用一个服务员来卖就可以&#xff0…

当心Spring缓慢的事务回调

TL; DR 如果您的应用程序无法获得新的数据库连接&#xff0c;则重新启动ActiveMQ代理可能会有所帮助。 有兴趣吗 性能问题 几个月前&#xff0c;我们经历了生产中断。 大家都很熟悉&#xff0c;许多请求都失败了&#xff1a; java.sql.SQLTransientConnectionException: Hika…

jmeter学习笔记(八-1)

Jmeter中有较多需要参数化测试的地方&#xff1a; 1.从一个用户登录的接口获取登录后的token值&#xff0c;取值后用于后续接口调用 2.获取用户浏览后的cookies信息&#xff0c;需要用到HTTP Cookie 管理器来为同一线程组提供通用的cookies信息 Jmeter中通过${}形式来取参数值 …