当我们需要对象的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()
?
答案 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;
方法,这怎么可能呢?