是否需要在Java中记录重写hashCode()
和toString()
或类似的方法? (当然不包括equals()
和类似的)
有哪些惯例?
答案 0 :(得分:1)
来自Oracle's JavaDoc指南:
因此,如果被覆盖或已实现的方法的文档已足够,则无需为
m()
添加文档。
如果您的hashCode或toString正在执行与Object中的文档不同的操作,那么您需要修改代码而不是文档。任何使用这些方法而无法访问JavaDoc的人都希望它们的行为符合Object。
的JavaDoc:
答案 1 :(得分:0)
如果你使用一些需要记录的特殊算法,我会写内联注释// ...,但这应该与API用户无关,他依赖于继承的Javadoc表达的合同,所以我不会把它写成Javadoc评论。
答案 2 :(得分:0)
有时记录它们很有用。例如,如果一个对象是Swing模型(ListModel,TableModel等)返回的值,则它的toString
方法可能返回一个用于显示给用户的显示字符串,而不是一个字符串。用于调试。我经常想清楚一个对象的toString是否适合显示给最终用户。
我将记录equals
以指明哪些属性或哪些州构成平等,例如URI.equals和List.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()
保持一致的一般合同就足够了。
toString()
消息的格式。他还指出,在这种情况下,你应该提供一个也提供一个解析函数(一个静态工厂方法),它在给定String
表示的情况下创建一个类的对象。
答案 4 :(得分:0)
您不应该覆盖这些方法的Object
类文档,因为它描述了可以遵循所有实现(包括您的实现)的合同。 可能适合使用有关您的实现的其他注释来扩展继承的文档。你可以这样做:
/**
* {@inheritDoc}
* <p>
* In this implementation...
*/
Javadoc工具将插入超类文档来代替{@inheritDoc}
标记,以便输出将包含超类文档,后跟附加注释。