繁体   English   中英

我应该记录重写的hashCode()和toString()吗?

[英]Should I document overriden hashCode() and toString()?

是否需要记录Java中重写的hashCode()toString()或类似方法? (不包括equals()和类似的东西)有哪些约定?

Oracle的JavaDoc指南中:

因此,如果覆盖或实现的方法的文档足够,则无需为m()添加文档。

如果您的hashCode或toString在做与Object中文档不同的操作,那么您需要修改代码而不是文档。 任何使用这些方法但无法访问JavaDoc的人都希望它们的行为与Object中记录的一样。

JavaDoc的:

hashCode toString

如果您使用一些需要记录的特殊算法,我将编写内联注释// ...,但这对于依赖于继承的Javadoc表示的合同的API用户来说应该无关紧要,所以我不会将其写为Javadoc注释。

有时记录它们很有用。 例如,如果一个对象旨在成为Swing模型(ListModel,TableModel等)返回的值,则其toString方法可以返回旨在向用户显示的显示字符串,而不是用于调试的字符串。 我经常想弄清楚对象的toString是否适合显示给最终用户。

我将用equals表示equals以指示哪些属性或哪个状态构成了相等性,就像URI.equalsList.equals一样。 类似地,指出在其上的属性或状态有用hashCode依赖,尤其是对于可变对象,因为它允许开发人员避免更改状态下,当对象被用作散列密钥。

如果有必要使用指定的算法来计算哈希码,则应为hashCode()方法记录该算法。 Java本身为String.hashCode()执行此操作:

此字符串的哈希码。 字符串对象的哈希码计算为

 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示幂。 (空字符串的哈希值为零。)

但是,对于大多数其他情况, Object.hashCode()的常规协定要求该协定与equals()保持一致就足够了。

Effective Java中的 Bloch建议记录值类toString()消息格式。 他还指出,在这种情况下,您还应该提供一个解析函数(一个静态工厂方法),该函数创建给定其String表示形式的类的对象。

您不应覆盖这些方法的Object类文档,因为它描述了所有实现(包括您的实现)都应遵循的约定。 在继承的文档中添加有关实现的其他说明, 可能是合适的。 您可以这样做:

/**
 * {@inheritDoc}
 * <p>
 * In this implementation...
 */

Javadoc工具将在{@inheritDoc}标记的位置插入超类文档,以便输出将由该超类文档和其他注释组成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM