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

std::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

std::tostring

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

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

相关文章

php数组按时间排序,按日期时间在PHP中对数组中的数组进行排序

我目前在PHP中有一个问题,我想按照创建日期对这些帖子进行排序,以便它们可以按降序显示.我一直在寻找一个PHP函数来做到这一点,但没有运气.有一个简单的解决方案吗?任何想法将不胜感激:)array0 >arraypost_id > string 1 (length1)user_id > string 3 (len…

没学过编程能学python吗_我没学过编程,能否学会Python?

学习Python编程语言,是大家走入编程世界的最理想选择。那么我没学过编程,能否学会Python?上海Python培训肯定的回答您:of course!完全能学会!设计大师说过,留白是很好的风景,适当的留白是设计的至高境界;对于没有编程…

java登录界面命令_Java命令行界面(第13部分):JArgs

java登录界面命令JArgs 1.0的区别在于,这是我的第13篇文章的主题,该文章是关于Java命令行参数解析的。 JArgs是一个开放源代码( BSD许可 )库,主要由Steve Purcell和Ewan Mellor等 不同贡献者支持。 事实证明&#xff0…

QPW 企业维度评分表(tf_company_dimesion)

企业维度评分表 用于保存企业每个维度的评分数据,目前企业有5个点评维度,用户可以对这5个维度分别点评,所以企业目前会有5个维度的评分,也就是说企业的每个维度有各自分值、好评率 CREATE TABLE tf_company_dimesion (com_dim_i…

QPW 手机短信验证码发送日志表(tf_sms_send_log)

文章目录手机短信验证码发送日志表需求说明手机短信验证码发送日志表 CREATE TABLE tf_sms_send_log (send_id bigint(11) NOT NULL AUTO_INCREMENT COMMENT 发送ID,user_id bigint(11) DEFAULT NULL COMMENT 用户ID,phone varchar(20) DEFAULT NULL COMMENT 手机号码,validat…

app 应用商店系统php,GitHub - ChhXin/appstore-admin: 基于ThinkPHP的应用商店后台管理系统...

数据库大作业简介ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计…

java登录界面命令_Java命令行界面(第11部分):CmdLn

java登录界面命令这篇文章介绍了如何使用Ostermiller Java Utilities 1.08.02的CmdLn(Java命令行解析器)来处理基于Java的应用程序中的命令行参数。 Ostermiller Java实用程序包括几种不同类型的实用程序 ,但本文的重点是组件页面上描述的“命…

socket模拟http的登陆_Python网络爬虫之模拟登陆 !

为什么要模拟登陆?Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面。保存用户信息模拟登陆后有两种…

QPW 系统管理后台用户表(tm_user_info)

文章目录系统管理后台用户表字段说明系统管理后台用户表 CREATE TABLE tm_user_info (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,user_no varchar(30) DEFAULT NULL COMMENT 用户编号, # 允许用户自定义任意字符的编号,非空时不允许重复&#xff0c…

java登录界面命令_Java命令行界面(第12部分):CLAJR

java登录界面命令第十二篇有关在Java中处理命令行参数的文章的特色库是带有Java Reflection的命令行参数 (CLAJR)。 该“库”是单个Java源文件( CLAJR-0.9.java ), 可从SourceForge下载 。 CLAJR的主页当前显示2006年版…

java导出excel搜索下拉框,POI写入Excel下拉框[Select选项]

记录部分方法, 操作POIPOI version3.10-FINALorg.apache.poipoi${poi.version}org.apache.poipoi-ooxml${poi.version}1.首先根据路径读取Excel模板/*** 读取服务器上面的上传的excel文件** param path* return*/public static Workbook readWorkBook(String path) {Workbook w…

openssh rpm包_100台CentOS7要升级OpenSSH怎么办?

背景现在有 100 台 Centos7 需要升级 OpenSSH 到 8.3,怎么办呢?一台台的操作显然不符合我摸鱼的风格,既然每台操作都一样,Ansible Roles 就有用武之地了。正常升级流程首先 rpmbuild 打出 OpenSSH 8.3 的 RPM 包,rpm -…

java 从一个容器获取对象,如何从 Spring IoC 容器中获取对象?

前面几篇文章主要分析了 Spring IoC 容器如何初始化,以及解析和注册我们定义的 bean 信息。其中,「Spring 中的 IoC 容器」对 Spring 中的容器做了一个概述,「Spring IoC 容器初始化」和「Spring IoC 容器初始化(2)」分析了 Spring 如何初始化…

thymeleaf与jsp_PagingAndSortingRepository –如何与Thymeleaf一起使用

thymeleaf与jsp在本教程中,我将演示如何通过分页显示Thymeleaf中的企业客户列表。 1 –项目结构 我们有一个正常的Maven项目结构。 2 –项目依赖性 除了正常的Spring依赖关系之外,我们还添加Thymeleaf和hsqldb,因为我们使用的是嵌入式数据…

MySQL 数据库中如何将表字段的空值全部替换成空字符串

UPDATE permissions SET name ( CASE WHEN IFNULL(name, ) THEN ELSE name END ) WHERE name IS NULL;

python requests是什么_如何基于Python + requests实现发送HTTP请求

这篇文章主要介绍了如何基于Python requests实现发送HTTP请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、在接口自动化测试过程中,存在两种情况: 一种是不需要鉴权的接口&#…

MySQL 批量生成 SQL 脚本语句解决实际的业务需求/如何拼接字符串/拼接字符串的 SQL 语句

文章目录实际需求分析思路写拼接 SQL 脚本的脚本语句执行得到脚本语句保存成 SQL 脚本文件实际需求 有些行政区域的字段 area_fullname 是空的,如何补全呢?如下所示: 分析思路 (一)如何取到每个区域的上级名称和上…

php的变量都放在哪里,php变量一般放在哪个位置

php变量一般放在哪个位置php定义变量的要求格式,是非常宽松的,至于在哪里定义变量就需要看你的需求,可以在构造函数,也可以在你定义的方法中定义局部变量,也可以在构造函数外面定义全局变量。// 局部变量 函数内部func…

oauth2令牌刷新_了解OAuth2令牌认证

oauth2令牌刷新1.简介 在本教程中,我们将了解OAuth2令牌身份验证 ,以便只有经过身份验证的用户和应用程序才能获得有效的访问令牌,该令牌随后可用于访问服务器上的授权API(在OAuth术语中仅是受保护的资源)。 使用基于…

整型数组 判断 java,给定一个整数数组,判断其中是否有3个数和为N

借助集合将复杂度降到n2,但耗时还是比较长。 import java.util.HashMap;import java.util.HashSet;import java.util.Scanner;/*** Author: coderjjp* Date: 2020-05-07 8:40* Description:给定一个整数数组,判断其中是否有3个数和为N* version: 1.0*/public class …