大连承揽营销型网站公司,长荣建设深圳公司网站,规划怎样做网站,app引流推广怎么做两种方法之间的区别#xff1f; Java枚举有两种方法来检索枚举常量的值#xff1a; name#xff08;#xff09;和.toString#xff08;#xff09; 。 toString#xff08;#xff09;方法调用name#xff08;#xff09;方法#xff0c;该方法返回枚举常量的字符串… 两种方法之间的区别 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中的代码。 清单3valueOf方法返回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