我应该文档覆盖hashCode()和toString()吗?

时间:2014-06-22 20:23:55

标签: java

是否需要在Java中记录重写hashCode()toString()或类似的方法? (当然不包括equals()和类似的) 有哪些惯例?

5 个答案:

答案 0 :(得分:1)

来自Oracle's JavaDoc指南:

  

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

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

的JavaDoc:

hashCode toString

答案 1 :(得分:0)

如果你使用一些需要记录的特殊算法,我会写内联注释// ...,但这应该与API用户无关,他依赖于继承的Javadoc表达的合同,所以我不会把它写成Javadoc评论。

答案 2 :(得分:0)

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

我将记录equals以指明哪些属性或哪些州构成平等,例如URI.equalsList.equals。类似地,指出hashCode依赖的属性或状态是有用的,特别是对于可变对象,因为它允许开发人员在将对象用作散列键时避免更改该状态。

答案 3 :(得分:0)

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

  

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

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

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

但是,对于大多数其他情况,Object.hashCode()要求与equals()保持一致的一般合同就足够了。

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

答案 4 :(得分:0)

您不应该覆盖这些方法的Object类文档,因为它描述了可以遵循所有实现(包括您的实现)的合同。 可能适合使用有关您的实现的其他注释来扩展继承的文档。你可以这样做:

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

Javadoc工具将插入超类文档来代替{@inheritDoc}标记,以便输出将包含超类文档,后跟附加注释。