2

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

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

我关注了许多 Java 资源,并且在这些 POJO 类中发现了一个共同点——

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

是否需要序列化或有助于提高性能或其他?

4

4 回答 4

5

这取决于您将 POJO 用于什么用途。一般来说,这当然不是必需的。toString()在默认的 Java 二进制序列化中不使用,尽管它可能被某些序列化框架使用。(我不知道有任何人这样做,但这远非不可能。)

也没有性能优势。

但是,无论是在调试器中还是在记录时,都可能有一个诊断好处 - 这是主要用途toString()- 获取用于诊断目的的字符串表示。在某些情况下,您可能还希望依赖于toString()非诊断目的,但是当您这样做时您通常会知道这一点......通常这样的实现不会只是StringUtil.toDetailString- 听起来它可能会产生一些东西-JSON-like,它比其他任何东西都更针对开发人员。

于 2014-05-05T10:25:08.887 回答
5

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

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

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

这在 99.8% 的情况下都没有用。通常你想读取你的类属性的值。为此,您需要覆盖toString().

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

如果您/其他人记录您的实例以查看它包含的内容,如果您不覆盖输出,toString()则输出将只是名称和哈希;这不是很丰富。

据我所知,性能方面完全没有影响,序列化(使用严肃的框架)也没有影响。

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

于 2014-05-05T10:27:50.187 回答
1

如果您对toString继承自Object. 默认值基本上为您提供类名和哈希值。

于 2014-05-05T10:24:56.593 回答
1

不,在所有 Pojo 类中都有 toString 不是“必需的”。如果你的 pojo 中没有 toString 方法,那么将调用超类(Object)的 toString 方法。因为一天结束,您所有的类都扩展了 Object 类。

这是 Object-toString() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()的 javadoc

public String toString() 返回对象的字符串表示。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。建议所有子类重写此方法。Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

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

于 2014-05-05T10:26:59.333 回答