是否需要在所有POJO类中添加toString()?
这是一个非常基本的问题,但我担心在每个POJO课程中都要编写一段代码。
我已经关注了很多java源代码,我发现这些POJO类中有一些常见的东西 -
@Override
public String toString() {
return StringUtil.toDetailString(this);
}
是否需要序列化或有助于提高性能?
答案 0 :(得分:5)
这取决于您将要使用POJO的内容。一般来说,这当然不是必需的。 toString()
未在默认Java二进制序列化中使用,尽管某些序列化框架可能会使用它。 (我不知道有任何这样做,但这远非不可能。)
也没有性能优势。
可能是诊断的好处 - 这是toString()
的主要用途 - 获取字符串表示以用于诊断目的,无论是在调试器中还是在记录时。在某些情况下,您可能还希望依赖toString()
用于非诊断目的,但是当您这样做时通常会知道...通常这样的实现不仅仅是StringUtil.toDetailString
- 听起来它只会产生一些可能类似JSON的东西,它更多地针对开发人员而不是其他任何东西。
答案 1 :(得分:5)
根据我的经验,我更喜欢在所有POJO类中添加toString()
方法,因为如果您想使用日志框架打印实例的当前状态,它会有所帮助。
默认的toString()
方法输出一个由以下字符组成的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
。
99.8%的时间没用。通常,您希望读取类属性的值。为此,您需要覆盖toString()
。
你永远不知道什么时候你想在调试框架之外看到它的状态。
如果您/其他人记录您的实例以查看它包含的内容,如果您不覆盖toString()
,则输出将只是名称和哈希值;这不是很有用。
根据我所知,性能方面根本没有受到影响,也没有序列化(使用严格的框架)。
我建议使用IDE的源代码生成功能来生成toString()
方法。它速度快,可以为您提供更多控制。
答案 2 :(得分:1)
如果您对从toString
继承的默认实现感到满意,则无需覆盖Object
。默认值基本上为您提供类名和哈希值。
答案 3 :(得分:1)
不,它不是"必需"在所有Pojo类中都有toString。如果你的pojo中没有toString方法,那么将调用超类(Object)的toString。因为一天结束时,所有类都扩展了Object类。
这是Object-toString()的javadoc http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()
public String toString() 返回对象的字符串表示形式。 通常,toString方法返回一个"文本字符串 代表"这个对象。结果应该是简洁但是 信息表达,便于人们阅读。它是 建议所有子类都重写此方法。 toString 类Object的方法返回一个由名称组成的字符串 对象是实例的类,符号字符`@', 和哈希码的无符号十六进制表示 宾语。换句话说,此方法返回一个等于的字符串 价值:
getClass()。getName()+' @' + Integer.toHexString(hashCode()) 返回:对象的字符串表示形式。