重写toString()对象的字符串表示有什么原因和好处?

时间:2014-07-22 20:55:18

标签: java class object tostring

当我们需要对象的String表示时,我们可以覆盖toString()方法。但是,当我们可以定义一个返回字符串的新方法时,覆盖toString()的真正好处和原因是什么?

请参阅以下示例:

class One
{
    private String name;
    public One(String _name)
    {
        name = _name;
    }

    @Override public String toString()
    {
        return name;
    }       
}

class Two
{
    private String name;
    public Two(String _name)
    {
        name = _name;
    }

    public String printMyClass() //Self-defined to print class details
    {
        return name;
    }       
}

在上面的示例中,自定义的printMyClass()似乎与toString()的内容相同。

所以我的问题是:为什么我们仍然使用toString()

3 个答案:

答案 0 :(得分:5)

主要的好处是库期望这种行为并使用它。

例如,如果您记录"funcX called with ("+param1+", "+param2+")",则会自动为您调用toString()

此外,这意味着您始终知道toString()方法可用(因为它已定义,因此您可以在每个对象上调用它,而无需担心它是否存在。

更好的问题是为什么不使用它?它是为您提供的,为什么您不想使用它?

答案 1 :(得分:3)

轻松转换为使用+运算符串联的字符串类型。

好处是您不必多次写printMyClass()

这是较短的

obj1 + " " + obj2

比这个

obj1.printMyClass() + " " + obj2.printMyClass()

我有时会用它来帮助调试器显示更可读的输出,但这有点古怪。

答案 2 :(得分:1)

由于所有其他 Java代码使用toString来获取String的{​​{1}}表示。

例如,考虑SLF4j中的参数化日志记录,这里我们使用格式Object和参数来创建日志记录语句:

String

如果日志记录级别足够低,日志记录库将采用格式log.info("User {} has just logged in.", user); 并在String上调用toString以获取最终日志消息。

这只是一个通常被称为"回叫"的事情的一个例子。由于user是Java API 许多库的一部分,因此使用它将toString转换为Object接口`和匿名类(pre Java 8),这是非常凌乱。

在最简单的示例中,考虑String. Doing the same, for example, deferred evaluation logging, would have required an级联和隐式String转换:

String

如果没有final String string = "User is " + user; 方法,这怎么可能呢?