11

我的一位教授曾经说过,永远不应该执行以下代码:

System.out.println(object.toString());

他说(我相信引用了“Effective Java”)它会导致双重调用。由于 print 语句调用对象的 toString 方法,因此调用两次 toString 方法的效率会降低。首选的方法是只使用:

System.out.println(object);

显然,这种方式在代码中看起来更好,并且可以节省时间。无论如何,我都会这样做,但我的问题是“这实际上更有效吗?”。在查看PrintStream文档时,print 方法已被重载以将 String 作为参数(如果首先调用 toString 方法就会出现这种情况)。我没有看到该版本的 print 方法调用输入参数的 toString 方法的位置,我认为这样做没有意义。

另外,对不起,如果这是重复的。我找不到任何关于它的主题。

4

3 回答 3

9

您的示例在 PrintStream 中调用了两种不同的方法。两者都toString()最多调用一次。

但是,使用System.out.println(object). 如果object为 null,则打印“null”。另一条语句引发 NullPointerException。

于 2013-05-15T17:08:40.683 回答
6

不,它不是更有效——正是因为你提到的过载。此外,调用toStringon aString非常快,因此即使没有过载,也无法测量差异。

但是,您的教授关于不调用 like 是正确的System.out.println(object.toString());,但原因不同:由于调用是不必要的,您的代码的读者可能会感到困惑。

于 2013-05-15T17:01:59.663 回答
0

在多线程环境中调用 System.out.println 实际上已经够糟糕了,甚至比对 toString 的不必要调用还要糟糕得多。存在“问题”是因为您在“println”中有一个同步调用:

public void println() {
newLine();
}

private void newLine() {
try {
    synchronized (this) {
    ensureOpen();
...
}

因此,如果您正在尝试编写高效的 java,您可以从避免它开始。作为替代方案,您可以使用任何不同的日志记录机制,例如http://www.slf4j.org/

于 2013-05-15T17:55:13.103 回答