Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该重写hashCode()和toString()吗?_Java - Fatal编程技术网

Java 我应该重写hashCode()和toString()吗?

Java 我应该重写hashCode()和toString()吗?,java,Java,是否需要在Java中记录重写的hashCode()和toString()或类似方法?(当然不包括equals()和类似内容) 有哪些约定?来自指南: 因此,如果重写或实现方法的文档已经足够,则不需要为m()添加文档 如果您的hashCode或toString对对象中的文档做了一些不同的操作,那么您需要修改代码而不是文档。因为任何使用这些方法而不访问JavaDoc的人都会期望它们的行为与Object中记录的一样 JavaDoc: 如果您使用一些需要文档化的特殊算法,我会编写内联注释//…,但这对

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

来自指南:

因此,如果重写或实现方法的文档已经足够,则不需要为
m()
添加文档

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

JavaDoc:


如果您使用一些需要文档化的特殊算法,我会编写内联注释//…,但这对依赖继承的Javadoc所表示的契约的API用户来说应该没有关系,因此我不会将其作为Javadoc注释来编写。

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


我将记录
equals
,以指示哪些属性或什么状态构成相等,如和do。类似地,指出
hashCode
所依赖的属性或状态也很有用,特别是对于可变对象,因为它允许开发人员在将对象用作散列键时避免更改该状态。

当有理由使用指定的算法计算散列码时,您应该为
hashCode()
方法记录该算法。Java本身就是这样做的:

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

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示求幂。(空字符串的哈希值为零。)

然而,对于大多数其他情况,
Object.hashCode()
的一般契约要求它与
equals()
保持一致,这就足够了


有效Java中的Bloch建议记录值类的
toString()
消息的格式。他还注意到,在这种情况下,您应该提供解析函数(静态工厂方法),该函数根据类的
字符串
表示创建类的对象。

您不应该覆盖
对象
类对这些方法的文档,因为它描述了所有实现的契约(包括您的)可能会遵循。可以适当地扩展继承的文档,并添加有关您的实现的附加说明。您可以这样做:

/**
 * {@inheritDoc}
 * <p>
 * In this implementation...
 */
/**
*{@inheritardoc}
*
*在这个实现中。。。
*/

Javadoc工具将插入超类文档来代替
{@inheritDoc}
标记,这样输出将由超类文档和附加注释组成。

您可以说明对象是如何用字符串表示的。
hashCode()的文档
是不必要的。这当然不是不可取的!(尤其是
hashCode()
我想说,除非您在原始文档中添加了额外的内容,否则不需要额外的文档。当您的
equals
方法变得足够复杂以证明Javadoc是正确的时候,就是您的
equals
方法做得太多的时候。对于
hashCode
@Makoto,也不一定是为了考试例如,
equals
方法是以数学上严格的方式定义的……我想补充一点,如果您的hashCode或toString正在做一些不同的事情,您不应该重写它们,而应该使用不同的方法。