2012-06-01 141 views
6

我只注意到了Enum#toString javadoc国家(重点煤矿):覆盖枚举#toString不可取?

返回此枚举常量的名称,它包含在声明。 此方法可能会被覆盖,但通常不需要合意。当一个更“程序员友好”的字符串形式存在时,枚举类型应该重写此方法。

默认情况下,toString()name()返回相同的事情,所以甚至一度toString已经被重写,人们仍然可以通过name()方法访问枚举的名称。

有没有人知道为什么重写Enum#toString不可取?

编辑:作为参考,name()的javadoc的(着重号为原):

返回此枚举常量的名称,正是因为在枚举声明中宣布。 大多数程序员应该优先使用toString()方法,因为toString方法可能会返回一个更易用的名称。此方法主要用于专门的情况,其中正确性取决于获取确切的名称,从发布到发布不会有所不同。

+0

可能需要的一个例子是,当存在一个现有的编码约定时,枚举值应该在全部大写中命名(例如'VALUE'),但对用户来说看起来很笨重,所以'toString'可以被实现为返回'name.toLowerCase()'或其他一些案例操作。 – jpm

+0

我的用例是enum代表显示给用户的一组选项(例如在'JComboBox'中)。我的第一个倾向是重写'toString'来为用户提供一个本地化的显示名称,但是javadoc建议只重写以获得更好的“程序员友好”字符串形式,这导致我认为它不适合用作“用户友好”的形式。然而,在'name()'的javadoc中的注释表明'toString()'被设计为返回一个* user * - 友好的名字,这使我相信'toString'的javadoc应该与“user-friendly”代替。 –

回答

1

我认为这里对于“合意”这个词的含义有些疑惑。 javadoc基本上说了同样的事情两次:覆盖toString()通常不需要枚举的工作,因此它是没有用(可取的)这样做。

因此,要回答你的问题:它会需要覆盖的toString(),如果:A)你知道,你永远不会有显示枚举名称的字符串表示,或B)的默认字符串如果需要,表示足以确定枚举。

+0

我不是英语母语的人 - 我认为不可取的意思是“应该避免”。你的解释是有道理的。 – assylias

+0

是的,我认为要更清楚一点,您可以用“推荐”一词替换“理想”。 – Seth

3

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

+1

对。当他们说这是不可取的时候,他们可能并不是说“你真的不应该这样做”,而是“停下来想一想你是否真的有充分的理由。”这一切都归结为为客户提供最不容易混淆的行为。 – jpm

+2

如果我真的想获取枚举值的名称,我称之为name,而不是toString。 – assylias

+1

是的,你可以做,但是因为toString默认为name,所以大多数人会认为name是返回值......特别是因为枚举的整个点是有一组常量值的。通过直接调用名称,可以确保您获得预期的结果。如果你需要替代格式或其他什么,你当然可以覆盖toString。 – Seth

2

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

+1

我的问题恰恰相反:为什么你不愿意做你所描述的? – assylias

+0

那么因为文档说它**通常不是必须的或不可取的我认为,除非在枚举中有一个“复杂”结构,否则它不是必须的。我不觉得文档的作者说“你不应该重写,这是一个坏主意” –