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

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

  1. java 默认tostring_【java基础】为什么重写toString()方法?

    不得不说,有很多java初学者写java实体类的时候,并没有真正理解重写toString() 方法,可能是口头知道也可能是跟风随带添加toString() 方法,并没有真正理解其意义,如果真要被问起来 ...

  2. 返回变量内容的错误示例和正确返回的4种方法

    正确返回的4种方法: 将要返回的变量设置为全局变量,所以退出函数时不会被销毁 返回一个局部静态变量,所以退出函数时不会被销毁 使用实参获取变量内容,因为实参是在函数外创建的,所以退出函数时不会被销毁 ...

  3. java 自定义tostring_自定义java toString方法

    java里我们经常System.out.println(xx) xx可以是一个List 一个HashMap 一个HashSet 一个什么奇怪的自定义的类. 只要能正确显示字符串的背后起作用的都是一个叫 ...

  4. 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果

    一直很纠结,Oracle的快速返回机制,虽然结果集很多,可是它能很快的显示第一个结果,虽然通过MYSQl的客户端可以做到,但是通过JDBC却不行. 今天用了1个多小时,终于搞定此问题,希望对广大Jav ...

  5. JdbcTemplate中queryForObject方法返回空结果或不正确结果数量的解决方法

    JdbcTemplate中queryForObject方法返回空结果或不正确结果数量的解决方法 参考文章: (1)JdbcTemplate中queryForObject方法返回空结果或不正确结果数量的 ...

  6. Java正确获取客户端真实IP方法整理

    转载自 干货:Java正确获取客户端真实IP方法整理 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apach ...

  7. 【代码猴子-培养正确的编程态度和方法】--《编程匠艺》

    转来的! [代码猴子-培养正确的编程态度和方法]--<编程匠艺> 从 博客园-首页原创精华区  作者:小伦 有 41 人喜欢此条目 作者: 小伦 发表于 2010-06-16 15:22  ...

  8. c语言数字的写法田字格,正确书写数字1-10的方法,实用!

    原标题:正确书写数字1-10的方法,实用! 版权声明: 文章内容来源于网络,版权归原作者所有,如有侵权请电话联系021-31216752,我们将及时删除. 要求:用田字格本书写,数字1-9书写时占右半 ...

  9. 如何正确使用TreeView的HitTest方法?

    Q:如何正确使用TreeView的HitTest方法? A:在TreeView控件 中有一个非常有用的方法HitTest,其功能 是返回指定坐标的节点对象 .其语法如下: object.HitTest ...

最新文章

  1. Java项目:企业人事管理系统(java+SSM+jsp+mysql+maven)
  2. 《Code Complete》ch.15 使用条件语句
  3. 《转》atomic assign retain
  4. simplexml php,php的simplexml
  5. android应用框架与原理之应用框架
  6. python网站后台_Python 网站后台扫描脚本
  7. JQuery-Dialog(弹出窗口,遮蔽窗口)
  8. Vh和Vw的简介和使用
  9. 浅析dedecms织梦网站留言板提交时验证码错误的解决办法
  10. java timezone_Java TimeZone setID()方法与示例
  11. 复习vue笔记第一天
  12. 使用组策略禁止域用户运行特定软件名称的程序
  13. 【PHP学习】—PHP连接数据库实现表单页面的验证功能(七)
  14. openstack--5--控制节点和计算节点安装配置nova
  15. 电脑网络里显示有两台计算机,2台电脑能共用一个显示器吗
  16. 生产排程php,生产管理中的生产排程排产流程建模
  17. 关于深度优先遍历和广度优先遍历的一些深入思考
  18. 凯联医疗完成逾亿元C轮融资 加速布局微量药物输注领域
  19. informix的数据类型列表
  20. 简历模板,简历通用模板,程序员求职简历模板

热门文章

  1. [ZJOI2011]营救皮卡丘(费用流 + 最短路)
  2. YBTOJ洛谷P4074:糖果公园(树上莫队)
  3. YbtOJ-序列计数【组合数学,莫队】
  4. P5322-[BJOI2019]排兵布阵【背包】
  5. ssl2331OJ1373-鱼塘钓鱼 之3【dp】
  6. codeforces773 D. Perishable Roads(思维+最短路)
  7. 【背包】小明逛超市(jzoj 2148)
  8. 简单多边形三角化(暴力)
  9. 分布式锁的多种实现方式
  10. JVM内存管理------垃圾搜集器精解