记录对象哈希码是否有用?

时间:2013-09-26 14:37:58

标签: java logging tostring hashcode

我在接手的项目中看到了很多以下几行:

log.debug(submitObject(" + object + ")");
log.debug(registerUser(" + user + ")");

等等。

在日志中打印出如下内容:

SubmitObject(java.lang.Object@13a317a)

仅记录对象类型及其哈希码是否有用?假设我想知道用户对象的名称,但我只有哈希码,是否可以根据哈希码重建对象?

来自object.toString()的javadoc

  

返回对象的字符串表示形式。一般来说,   toString方法返回一个“文本表示”的字符串   宾语。结果应该是简洁但信息丰富的表示   一个人很容易阅读。建议所有人   子类重写此方法。类Object的toString方法   返回一个字符串,该字符串由其类的名称组成   object是一个实例,at符号字符“@”和unsigned   对象哈希码的十六进制表示。其他   单词,此方法返回一个等于值的字符串:

     

getClass()。getName()+'@'+ Integer.toHexString(hashCode())
  返回:对象的字符串表示。

我自己总是覆盖自定义对象的toString(),因此它会打印出对象的所有字段。我应该开始打印目标代码吗?

3 个答案:

答案 0 :(得分:1)

不,继续覆盖toString(),这更有用。默认的toString()实际上是无用的,除了它至少显示了类实例是什么。

答案 1 :(得分:1)

该哈希码是随机分配的值。只有当你想检查你在之前的日志中有相同的对象或者不同的对象(即很少)时,它才有用

答案 2 :(得分:1)

如果您无权访问源代码,或者您不希望使用toString实现更改现有代码,则可以使用ReflectionToStringBuilder中的org.apache.commons


例如:

if (LOGGER.isDebugEnabled()) {

  LOGGER.debug("User : "
    + reflectionToStringBuilder.toString(user ,
         ToStringStyle.MULTI_LINE_STYLE))

LOGGER.debug("User : " + reflectionToStringBuilder.toString(user , ToStringStyle.MULTI_LINE_STYLE))

} 非常重要,因为"LOGGER.isDebugEnabled()操作或者reflectionToStringBuilder将在调用log.debug之前执行,因此您不需要这么昂贵的操作。

toString JavaDoc:http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/builder/ReflectionToStringBuilder.html