覆盖枚举#toString不可取?

时间:2012-06-01 15:31:29

标签: java enums

我刚注意到Enum#toString javadoc个州(强调我的):

  

返回声明中包含的此枚举常量的名称。 此方法可能会被覆盖,但通常不是必需或理想。当存在更“程序员友好”的字符串形式时,枚举类型应覆盖此方法。

默认情况下,toString()name()返回相同的内容,因此即使覆盖了toString,仍然可以通过name()访问枚举的名称方法

有人知道为什么覆盖Enum#toString是不可取的吗?

编辑:作为参考,name()的javadoc(重点与原文一样):

  

返回此枚举常量的名称,与其枚举声明中声明的完全相同。 大多数程序员应优先使用toString()方法,因为toString方法可能会返回一个更加用户友好的名称。此方法主要用于特殊情况,其中正确性取决于获取确切名称,不会因发行版本而异。

3 个答案:

答案 0 :(得分:3)

使用枚举,您有一组特定的常量值。当为该枚举调用toString方法时,通常会期望返回该名称,因此覆盖toString方法会返回一些意外的结果。

答案 1 :(得分:2)

如果您的枚举比其名称更复杂,例如如果它们包含私有字段,则可以覆盖toSting()以打印这些字段并更好地解释枚举字段而不仅仅是其名称。

答案 2 :(得分:1)

我认为这里有一些关于“理想”这个词含义的混淆。 javadoc基本上说了两次相同的东西:重写toString()通常不需要enum工作,因此这样做是不可行的(希望)。

所以回答你的问题:如果出现以下情况,那么可能会覆盖toString():A)你知道你永远不必显示枚举名称的字符串表示,或者B )默认字符串表示足以在需要时识别枚举。