Java POJO类中的toString()

Java POJO类中的toString(),java,tostring,pojo,apache-stringutils,Java,Tostring,Pojo,Apache Stringutils,是否需要在所有POJO类中添加toString() 这是一个非常基本的问题,但我担心在每n个POJO类中编写一段代码 我遵循了许多java源代码,在这些POJO类中发现了一些常见的东西- @Override public String toString() { return StringUtil.toDetailString(this); } 它是串行化所必需的,还是有助于提高性能或其他方面的功能?如果您对继承自对象的默认实现感到满意,则无需重写toString

是否需要在所有POJO类中添加toString()

这是一个非常基本的问题,但我担心在每n个POJO类中编写一段代码

我遵循了许多java源代码,在这些POJO类中发现了一些常见的东西-

@Override
    public String toString() {
        return StringUtil.toDetailString(this);
    }

它是串行化所必需的,还是有助于提高性能或其他方面的功能?

如果您对继承自
对象的默认实现感到满意,则无需重写
toString
。默认值基本上为您提供类名和哈希值。

这取决于您将使用POJO的目的。一般来说,这当然不是必需的
toString()
不用于默认的Java二进制序列化,尽管某些序列化框架可能会使用它。(我不知道有谁会这样做,但这绝非不可能。)

也没有性能优势

不过,无论是在调试器中还是在日志记录时,都有一个潜在的诊断好处,这就是
toString()
的主要用途,即获取用于诊断目的的字符串表示。在某些情况下,您可能还希望依赖
toString()
进行非诊断,但您通常在执行此操作时知道这一点。。。通常,这样的实现不仅仅是
StringUtil.toDetailString
——这听起来像是要产生类似于JSON的东西,它比其他任何东西都更面向开发人员。

不,在所有Pojo类中都不需要toString。如果pojo中没有toString方法,那么将调用超类(对象)的toString。因为一天结束时,所有的类都会扩展对象类

下面是对象-toString()的javadoc

公共字符串toString() 返回对象的字符串表示形式。 通常,toString方法返回一个“文本”字符串 表示“此对象”。结果应该是一个简洁但不复杂的过程 易于阅读的信息表示法。它是 建议所有子类重写此方法。toString 类对象的方法返回一个字符串,该字符串由 对象是其实例的类,符号为“@”, 和的哈希代码的无符号十六进制表示形式 对象换句话说,此方法返回一个字符串,该字符串等于 价值:

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


根据我的经验,我更喜欢在所有POJO类中添加一个
toString()
方法,因为它可以帮助您打印实例的当前状态,无论是否使用日志框架

默认的
toString()
方法输出由以下内容组成的字符串:

getClass().getName()+'@'+Integer.toHexString(hashCode())

这在99.8%的时间里都没有用。通常,您希望读取类属性的值。为此,您需要重写
toString()

您永远不知道何时要在调试框架之外查看其状态

如果您/其他人记录实例以查看其包含的内容,如果您不重写
toString()
,则输出将仅为名称和哈希;这不是很有用

就我所知,性能方面根本不受影响,序列化(使用严肃的框架)也不受影响


我建议使用IDE的源代码生成功能来生成
toString()
方法。它速度快,给你更多的控制权。

听起来很有趣。谢谢Jon,所以toString()出现在对象类中。上面的代码块正在更改默认toString()实现的定义。并且可以根据我们的要求随时修改。我做得对吗?只有在调试模式或记录器中才需要知道实例的当前状态。我接受它。但是它与Object.toString()有什么区别呢?
Object
类中提供的默认
toString()
实现提供了一个由
getClass().getName()+'@'+Integer.tohextString(hashCode())
组成的字符串,而这在99.8%的时间里是没有用处的。通常,您希望输出类的某些属性的值。已更新答案以包含该注释。很高兴我能帮忙!有用。谢谢你,希拉克。